在CamelConfiguration子类中,Spring的@Value无法正常工作

时间:2016-03-01 09:55:08

标签: java spring apache-camel spring-java-config

使用@ValueCamelConfiguration

时,我注意到一种奇怪的行为

有一个示例属性文件:

test.list=foo,bar,baz

并拥有PropertySourcesPlaceholderConfigurer,ConversionService以及在某些常规Spring配置中引用该属性时:

@Configuration
@PropertySource(value = "file:example.properties")
public class RegularConfig {

    @Value("${test.list}")
    List<String> testList;

}

一切都按预期工作(testList包含三个值:foobarbaz),但是当配置类扩展org.apache.camel.spring.javaconfig.CamelConfiguration时:< / p>

@Configuration
@PropertySource(value = "file:example.properties")
public class RegularConfig extends CamelConfiguration {

    @Value("${test.list}")
    List<String> testList;

}

(请参阅https://github.com/michalmela/stackoverflow-questions/tree/master/35719697处的两个案例的最小运行示例)

testList包含一个已加入的值:foo,bar,baz

这是我的错误配置吗?或某种错误(或功能)?

(我知道明显的解决方法是手动拆分值,这是我已经使用过的,但我只想了解这里发生了什么)

2 个答案:

答案 0 :(得分:2)

CamelConfiguration声明BeanPostProcessorcamelBeanPostProcessor)。 BeanPostProcessor-s首先由spring实例化(因为它们必须查看所有其他bean实例化)。

当Spring实例化此camelBeanPostProcessor时,它会创建扩展CamelConfiguration的类的实例,注入属性并调用camelBeanPostProcessor()

因此,在Spring ApplicationContext初始化开始时注入此实例中注入的属性。目前,您的ConversionService尚未注册:使用的是默认转换器,而不是StringToCollectionConverter

作为一种变通方法,您可以在刷新applicationContext之前显式注册ConversionService

AnnotationConfigApplicationContext ctxt = new AnnotationConfigApplicationContext();
ctxt.getBeanFactory().setConversionService(new DefaultConversionService());
ctxt.register(...);

答案 1 :(得分:-1)

我知道这可能听起来很愚蠢,但你确定配置在扩展CamelConfiguration类之前是否正常工作?我不认为没有使用SpEL的@Value会拆分列表。我会使用这个配置

@Value(value = "#{'${test.list}'.split(',')}")

您使用的是哪个版本的Spring?感谢