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

Gew*_*ure 5 java configuration spring properties-file spring-boot

好的,所以我有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
Run Code Online (Sandbox Code Playgroud)

我然后尝试注入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
}
Run Code Online (Sandbox Code Playgroud)

..然后用于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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

...由以下人员调用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

......让我产生 NullPointerException

Caused by: java.lang.NullPointerException: null
    at forex.market.service.MarketService.printConfig(MarketService.java:67) ~[classes/:na]
Run Code Online (Sandbox Code Playgroud)

Q1: 基本上我做得对吗?

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

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

Dir*_*yne 3

您需要设置属性前缀 不需要@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
Run Code Online (Sandbox Code Playgroud)

将 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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 看看这里 [demo](https://github.com/dirkdeyne/properties) 不要在这里得到空指针... (2认同)