在spring boot中从属性文件中注入值数组

时间:2018-05-04 16:43:12

标签: java spring spring-boot configuration properties-file

好的,我有file_input.send_keys(os.path.abspath("path/to/the/file.xyz")) ..:

config.properties

然后我试图像这样注入market.curpairs[0].name=EuroDollar market.curpairs[0].symbol=EURUSD market.curpairs[0].minamount=0.1 market.curpairs[1].name=EuroFranken market.curpairs[1].symbol=EURCHF market.curpairs[1].minamount=0.1 market.currs[0].name=Euro market.currs[0].symbol=EUR market.currs[0].minamount=1.0 market.currs[0].withfee=0.1 market.currs[1].name=Dollar market.currs[1].symbol=USD market.currs[1].minamount=1.0 market.currs[1].withfee=0.1 market.currs[2].name=Franken market.currs[2].symbol=CHF market.currs[2].minamount=1.0 market.currs[2].withfee=0.1

MarketConfig.java

..然后在@PropertySource("classpath:config.properties") @ConfigurationProperties(prefix = "market") @Validated public class MarketConfig { // the configured currencies private List<MarketCurrency> currs; // the configured currencypairs private List<MarketCurrencypair> curpairs; /* static classes */ public static class MarketCurrency { String name; String symbol; double minamount; // getter and setter ommitted } public static class MarketCurrencypair { String name; String symbol; double minamount; double withfee; // getter and setter ommitted } // getter and setter ommitted } 中使用:

MarketService.java

...由 @Service public class MarketService implements IMarketService { private final MarketConfig config; // .... public MarketService(MarketConfig config) { this.config = config; } // .... public void printConfig() { System.out.println("________________ CONFIGURATION: "); this.config.getCurpairs().forEach(System.out::println); this.config.getCurrs().forEach(System.out::println); } }

调用
Applicationmain

...让我@SpringBootApplication @EnableSwagger2 @ComponentScan @EnableConfigurationProperties({MarketConfig.class}) public class MarketApplication implements CommandLineRunner { private final MarketService service; /** * Constructor * @param service ..the Service */ public MarketApplication(MarketService service) { this.service = service; } public static void main(String[] args) { SpringApplication.run(MarketApplication.class, args); } @Override public void run(String... args) throws Exception { this.service.printConfig(); } }

NullPointerException

Q1: 我做得对吗,基本上?

Q2: 我在互联网上找不到任何帮助如何在属性文件中处理原始元组的数组,是否可以将其注入spring-boot配置 - 或者我是否需要使用{{将我的配置重写为字符串1}}获取单个值(为了可维护性和可读性,我真的不想这样做)?

提前致谢 - 如果您遗漏了一些信息/来源,请发表评论,我会尽快提供。

1 个答案:

答案 0 :(得分:2)

您需要设置属性前缀 不需要 @Configuration @Component 并使用嵌入式公共静态类来包装货币的属性

 @PropertySource("classpath:config.properties")
 @ConfigurationProperties(prefix = "market")
 @Validated
 public class MarketConfig {
      List<MarketCurrency> currs;
      //getters setters

      public static class MarketCurrency {

          String name;
          String symbol;
        ....
//getters setters

将MarketConfig.class添加到@EnableConfigurationProperties

 @SpringBootApplication
 @EnableSwagger2
 @EnableConfigurationProperties({MarketConfig.class})
 public class MarketApplication implements CommandLineRunner {

    private final MarketService service;
    private final MarketConfig config;

    public MarketApplication(MarketService service, MarketConfig config) {
       this.service = service;
       this.config = config;
    }