我试图使用@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值将传入资源变量。
请帮助
答案 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();
}
在由组件扫描处理的类中。