java - 在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
然后我尝试像这样注入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
Caused by: java.lang.NullPointerException: null
at forex.market.service.MarketService.printConfig(MarketService.java:67) ~[classes/:na]
Q1: 基本上我做对了吗?
Q2:
我在互联网上找不到任何关于如何处理属性文件中的原始元组数组的帮助,是否可以将其注入到 spring-boot 配置中 - 或者我是否需要将我的配置重写为字符串,使用split()
获取单个值(为了可维护性和可读性,我真的不想这样做)?
在此先感谢-如果您错过了一些信息/来源,请发表评论,我会尽快提供。
解决方案
你需要设置你的属性前缀 不需要@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;
}
推荐阅读
- node.js - 如何在 Node 中的 Mongoose 上触发套接字事件?
- java - Websphere jdbc连接不可用
- python - 在 jupyter notebook 中以离线模式使用 plotly(使用 nbcovert --execute)打开 IDE(vscode)
- php - PHP 7.2 更新:标题中的 DropDown 警告声明
- php - 多个返回值的类型声明/提示/注释
- android - Android studio'错误运行'应用':未找到默认活动
- c++ - std::unordered_map 的自定义分配器以设置增量值
- angularjs - 在 angularJS 应用程序中的 uib-accordion 模板中使用我自己的函数
- java - 带有标准生成器的 string_agg
- android - 旧版本的firebase错误?