我在使用 Spring ConversionService
时发现了一个问题(起初我以为这与我的测试有关,但这是我的错误,它总是发生)。我尝试通过...创建它
@Configuration
@ComponentScan(basePackages={"com.mybasepacke"})
public class MyConfiguration {
@Bean
@SuppressWarnings("rawtypes")
public ConversionServiceFactoryBean conversionService(ApplicationContext context) {
ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean();
Map<String, MyConverter> converters = context.getBeansOfType(MyConverter.class);
factory.setConverters(new HashSet<>(converters.values()));
factory.afterPropertiesSet();
return factory;
}
}
这样,我希望能够简单地创建 Converter
(MyConverter
只是一个扩展 Spring 的 Converter
的标记接口(interface)),例如这……
@Component
public class ExampleConverter implements MyConverter<Something, SomethingElse> {
@Autowired
private SomeService someService;
... }
Spring 应该找到所有的 MyConverter
,将它们全部添加到 ConversionService
(工厂),然后我就可以使用它们了……理论上。实际上,会发生这种情况:
ConfigurationPropertiesBindingPostProcessor
被初始化。- 它有选择地依赖于
ConversionService
。 - Spring 找到我的
ConversionServiceFactoryBean
定义并启动它。 - 不幸的是,
ConfigurationPropertiesBindingPostProcessor
是在AutowiredAnnotationBeanPostProcessor
注册之前创建的。所以它的所有依赖项都不是 Autowiring 的。这导致我所有的转换器都没有 Autowiring 。
有谁知道如何防止这种行为?或者我是否必须摆脱 ConversionService,因为它似乎无法使用带有 Autowiring 字段的转换器?
最佳答案
不要命名您的ConversionService
conversionService
, check the doc这基本上可以解释您自己的发现。
@Bean
public ConversionService myConversionService() {
// your setup
}
这将注册一个 myConversionService
(注意方法名称),它不会被配置内容急切加载。如果您需要一些转换器从配置中获取值(如文档中所定义),请考虑使用 ConfigurationPropertiesBinding
标记这些转换器:
@Component
@ConfigurationPropertiesBinding
// This can't autowire things either ...
public class ExampleConverter implements MyConverter<Something, SomethingElse> { ... }
关于java - Spring - ConversionService 没有 @Autowired 因为 ConfigurationPropertiesBindingPostProcessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38971034/