如何在itemProcessor中接收application.properties值

时间:2018-07-31 20:29:20

标签: spring spring-batch

我正在尝试将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.")
    }
}

3 个答案:

答案 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
}