@Value注释不会注入属性值

时间:2015-08-07 07:15:16

标签: java spring spring-batch

我试图使用@Value注释从属性文件中获取文件路径,但是获得Null。

我的属性文件就像

filepath=file:/src/main/resources/usmr/input/redemption.txt

我的xml文件就像那样

<bean id="USMRFileReader" class="com.aexp.earn.api.batch.util.readers.USMRFileReader" />
<util:properties id="batchProps" 
    location="classpath:earn-api-batch_e0.properties" />

<batch:job id="balancingUSMRFileJob">
    <batch:step id="step1">
        <batch:tasklet>
            <batch:chunk reader="USMRFileReader" writer="ControlReportWriter" processor="USMRListProcessor" commit-interval="1"></batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

我的Java文件就是那样

@Component(value = "USMRFileReader")
@Scope("step")
public class USMRFileReader implements ItemReader<String> {
private static final Logger ILOGGER = LoggerFactory.getLogger(LoggerUtil.LOGGER_BATCH);

@Value("${batchProps['filepath']}")
private Resource resource;

但是在执行此操作时,null值将传入资源变量。

请帮助

3 个答案:

答案 0 :(得分:0)

您可以通过@PropertySource注释轻松完成此操作。因此,例如,您的类应该具有@PropertySource注释,如下所示:

@PropertySource("classpath:earn-api-batch_e0.properties")
@Component(value = "USMRFileReader")
@Scope("step")
public class USMRFileReader implements ItemReader<String> { ... }

然后注入你的资源:

@Value("${filepath}")
private Resource resource;

瞧!诀窍已经完成。

另外,请确保在某处定义PropertyPlaceholderConfigurer以便读取属性:

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

答案 1 :(得分:0)

您可以使用property-placeholder代替util:properties

替换此

<util:properties id="batchProps" 
    location="classpath:earn-api-batch_e0.properties" />

以下

<context:property-placeholder location="classpath:earn-api-batch_e0.properties"/>

然后你可以从组件中获取属性值:

@Component(value = "USMRFileReader")
@Scope("step")
public class USMRFileReader implements ItemReader<String> {
private static final Logger ILOGGER = LoggerFactory.getLogger(LoggerUtil.LOGGER_BATCH);

@Value("${filepath}")
private String resource;

修改

在配置文件中添加context命名空间

<beans xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
         http://www.springframework.org/schema/context">

答案 2 :(得分:-1)

将完整的环境注入bean并进行调试,以便查看哪些属性确实是从哪个资源加载的。

@Environment
private Environment env;

Environment实现了PropertyResolver接口,它是所有属性的门,由spring上下文加载。调试注入的具体实现。

检查您的文件是否真正被加载并且该属性是否存在。检查它是否以某种方式被覆盖,并通过具有更高优先级的东西设置为null。

如果属性在Environment中(您可以通过简单地调用env.getProperty("filepath")来轻松检查),那么这意味着您的@Value注释不会解析SPEL表达式。如果您没有

,就会发生这种情况
@Bean
public PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

在由组件扫描处理的类中。