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

Spring's @Value not working correctly when in CamelConfiguration subclass

我注意到将 @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),但是当配置 class 扩展 org.apache.camel.spring.javaconfig.CamelConfiguration:

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

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

}

(请参阅 https://github.com/michalmela/Whosebug-questions/tree/master/35719697 中两种情况的最小 运行 示例)

testList 包含一个,连接值:foo,bar,baz

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

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

我知道这听起来很愚蠢,但您确定在扩展 CamelConfiguration class 之前配置工作正常吗?在我看来,不使用 SpEL 的 @Value 不会拆分列表。我会使用这个配置

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

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

CamelConfiguration 声明一个 BeanPostProcessor (camelBeanPostProcessor)。 BeanPostProcessor-s 首先由 spring 实例化(因为它们必须看到所有其他 beans 实例化)。

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

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

作为解决方法,您可以在刷新 applicationContext 之前显式注册 ConversionService

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