我在使用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;
    }
}


这样,我希望能够像这样简单地创建ConverterMyConverter只是扩展Spring的Converter的标记接口)...

@Component
public class ExampleConverter implements MyConverter<Something, SomethingElse> {

    @Autowired
    private SomeService someService;
... }


Spring应该找到所有MyConverter,并将它们全部添加到ConversionService(工厂)中,然后就可以使用它们了...从理论上讲。实际上,发生这种情况:


ConfigurationPropertiesBindingPostProcessor被初始化。
它视情况取决于ConversionService
Spring找到我的ConversionServiceFactoryBean定义并启动它。
不幸的是,ConfigurationPropertiesBindingPostProcessor是在注册AutowiredAnnotationBeanPostProcessor之前创建的。因此,它的所有依赖项都不是自动装配的。导致我的所有转换器无法自动接线。


有谁知道如何防止这种行为?还是我必须摆脱ConversionService,因为它似乎无法将Converters与自动装配字段一起使用?

最佳答案

不要将您的ConversionService conversionServicecheck 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 -ConversionConfiguration否@Autowired由于ConfigurationPropertiesBindingPostProcessor,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38971034/

10-10 19:38