java - Spring - ConversionService 没有 @Autowired 因为 ConfigurationPropertiesBindingPostProcessor

标签 java spring spring-boot

我在使用 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(工厂),然后我就可以使用它们了……理论上。实际上,会发生这种情况:

  1. ConfigurationPropertiesBindingPostProcessor 被初始化。
  2. 它有选择地依赖于 ConversionService
  3. Spring 找到我的 ConversionServiceFactoryBean 定义并启动它。
  4. 不幸的是,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/

相关文章:

java - 从 Lucene 标准分析器中删除空格字符

java - 在不安装 SMTP 服务器的情况下测试 Greenmail

java - Spring boot JPA Postgres enrity 未保存

java - "Refused to set unsafe header ' Cookie ' "同时以 Angular 6 发送带有 GET 请求的 cookie

java - 巴士路线计划,我使用什么样的算法和数据结构?

Java - 二进制搜索()。如何为拼写检查设置 binarySearch

java - 在同步中调用异步方法

java - @Value 在单元测试中返回 null

java - Android VideoView 不播放视频

spring - WSS4J 与 Spring WS : (WSSecurityEngine: Invalid timestamp The security semantics of the message have expired)