使用@Value
与CamelConfiguration
有一个示例属性文件:
test.list=foo,bar,baz
并拥有PropertySourcesPlaceholderConfigurer,ConversionService以及在某些常规Spring配置中引用该属性时:
@Configuration
@PropertySource(value = "file:example.properties")
public class RegularConfig {
@Value("${test.list}")
List<String> testList;
}
一切都按预期工作(testList
包含三个值:foo
,bar
和baz
),但是当配置类扩展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
。
这是我的错误配置吗?或某种错误(或功能)?
(我知道明显的解决方法是手动拆分值,这是我已经使用过的,但我只想了解这里发生了什么)
答案 0 :(得分:2)
CamelConfiguration
声明BeanPostProcessor
(camelBeanPostProcessor
)。 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?感谢