我正在尝试将application.properties中的值传递到自定义ItemProcessor中。但是,使用@Value注释总是返回null,这并非完全意外。但是,我不知道如何在不使用@Value的情况下传递必需的值。
@Service
class FinancialRecordItemProcessor implements ItemProcessor<FinancialTransactionRecord, FinancialTransactionRecord> {
Logger log = LoggerFactory.getLogger(FinancialRecordItemProcessor)
// Start Configs
@Value('${base.url:<redacted URL>}')
String baseUrl
@Value('${access.token:null0token}')
String accessToken
// End Configs
@Override
FinancialTransactionRecord process(FinancialTransactionRecord financialRecord) throws IllegalAccessException{
// Test to ensure valid auth token
if (accessToken == null || accessToken == "null0token"){
throw new IllegalAccessException("You must provide an access token. " + accessToken + " is not a valid access token.")
}
}
答案 0 :(得分:0)
您定义了context:property-placeholder
吗?
例如,如果您的配置位于classpath:/configs
,则需要:
<context:property-placeholder location="classpath:/configs/*.properties" />
答案 1 :(得分:0)
您处在正确的轨道上。看看@StepScope
摘自官方文档:
方便的步骤范围的Bean注释,默认为代理 模式,因此不必在每个bean上都明确指定它 定义。在需要从中注入@Values的任何@Bean上使用此方法 步骤上下文,以及需要与 步骤执行(例如ItemStream)。例如
示例:
@Bean
@StepScope
protected Callable<String> value(@Value("#{stepExecution.stepName}")
final String value) {
return new SimpleCallable(value);
}
因此,基本上,您只能注入从步骤上下文定义的值,也可以注入作业上下文中的值,例如
@Value(value = "#{jobParameters['yourKey']}")
private String yourProperty;
可以在作业执行之前设置jobParameters:
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.addString("yourKey", "a value")
.toJobParameters();
final JobExecution jobExecution = jobLauncher.run(job, jobParameters);
答案 2 :(得分:0)
找到了解决方案。与其在全局变量上使用@Value,不如将它们传递给构造函数,即
FinancialRecordItemProcessor(String baseUrl, String accessToken){
super()
this.baseUrl = baseUrl
this.accessToken = accessToken
}