spring boot从不同的maven模块读取属性文件

时间:2015-11-30 09:16:56

标签: java spring-mvc properties spring-boot

我的maven项目有三个模块,webservicecommon

我项目的某些部分是这样的:

demo-parent:
  --web
    --src
      --main
        --java
          --Application.java
        --resources
          --application.properties
          --application-mysql.properties
   --service
   --common
     --src
       --main
         --java
           --ErrorCode.java
         --resources
           --application-errors.properties

在网络模板Application.java中,我想阅读common moudle application-errors.properties中的内容。

以下是ErrorCode.java中的common

@Configuration
@EnableAutoConfiguration
@EnableConfigurationProperties
@ConfigurationProperties(locations = "classpath:application-errors.properties")
public class ErrorCode {
    private int code;
    private String message;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

因为我想在application-errors.properties模块中使用此web,所以web moudle,Application.java

@SpringBootApplication
@PropertySources({
    @PropertySource("application-mysql.properties"),
    @PropertySource("application-errors.properties")
})
@EnableConfigurationProperties({ErrorCode.class})
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.run(args);
    }
}

现在,我将EnableConfigurationProperties添加到包含Application.java方法的main,我可以从application-errors.properties文件中获取密钥和值,我的问题是:

如果我想在服务中其他模块中调用appliction-errors.propertie,而服务没有主方法,我该怎么办?

我们可以使用java Properties类读取属性文件,但我想使用 spring方式

欢迎任何建议,谢谢。

1 个答案:

答案 0 :(得分:5)

您可以在其他模块中的服务中自动连接ErrorCode类,而不是访问application-error.properties(假设这些服务的构建类路径中存在ErrorCode)。

首先定义您的错误消息配置组件。

@Configuration
@ConfigurationProperties(locations = "classpath:application-error.properties")
public class ErrorCode {

    private int code;
    private String message;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

自动连接服务中的配置组件

@Component
public class Service {

    @Autowired
    private ErrorCode errorCode;


    public void accessErrorCode() {
        System.out.println(errorCode.getCode()); //Print code property
        System.out.println(errorCode.getMessage()); //print message property
    }

}

在spring应用程序中启用自动配置

@SpringBootApplication
@EnableAutoConfiguration
@EnableConfigurationProperties
public class Application {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplicationBuilder(Application.class).web(false).application();
        ConfigurableApplicationContext context = application.run(args);
        Service s = context.getBean(Service.class);
        s.accessErrorCode();
    }
}

根据EnableConfigurationProperties的Javadoc,

  

{@ link ConfigurationProperties} bean可以用标准方式注册(for    *使用{@link Bean @Bean}方法的示例),或者为方便起见,可以指定    *直接在这个注释上。

因此,使用注释ConfigurationProperties定义的所有bean都在应用程序上下文中检测到,并且可以在其他服务中自动连接。