Spring 启动中的多个转换服务

9o685dep  于 2022-12-13  发布在  Spring
关注(0)|答案(4)|浏览(127)

我有一个 Boot 应用程序,在我的一个外观中,我尝试自动连接conversionService,如下所示:

@Autowired
private ConversionService conversionService;

结果我得到了这个:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.core.convert.ConversionService] is defined: expected single matching bean but found 3: mvcConversionService,defaultConversionService,integrationConversionService
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1061)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 16 more

为了克服这一点,我添加了一个类似的限定符:

@Autowired
@Qualifier("mvcConversionService")
private ConversionService c;

所有的转换器都是自动添加到mvcConversionService的,现在我想扩展ConversionService并添加另一个方法,但是我的转换器再次添加到mvcConversionService。有没有办法告诉spring-boot使用哪个conversionService来自动注册我的转换器?我不知道I don“我不想手动列出新conversionService的所有转换器。

lsmepo6l

lsmepo6l1#

我也遇到过类似的问题。问题似乎是你需要定义你想使用哪个转换服务。你可以通过XML或者使用Sping Boot 配置来完成。
我在这里复制了一个非常similar question(对我有效的那个)的部分答案,并将这个问题标记为可能重复。
查看Spring文档后会发现,您应该声明一个ConversionService bean。在XML配置中,它将如下所示:

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="example.MyCustomConverter"/>
        </set>
    </property>
</bean>
1rhkuytd

1rhkuytd2#

如果你要找的是一个转换器列表,而且它们都实现了相同的接口,你可以在列表中自动连接。
例如:

@Service
public class MyService {

  @Autowired
  private List<MyConverter> myConverters;

  public void myMethod(MyRawThing thing) {
    myConverters
      .forEach(converter -> converter.doStuff(thing));
  }

}

并根据需要对它们进行迭代。
它的一个很好的特性是,当添加新的实现时,您不需要更新使用它们的代码。

o8x7eapl

o8x7eapl3#

说明

Spring将尝试为应用程序自动创建ConversionService(在您的情况下为mvcConversionService)。它没有用于注册转换器的限定符,因此如果您创建实现以下类型之一的组件/Bean,它将自动注册到服务。
1.转换器
1.通用转换器
1.打印机
1.解析器

解决方案1

忽略它。如果将这些转换器注册到mvcConversionService没有任何损害,则可能不值得您花时间来解决此限制。您的转换器类可能会被闲置。

解决方案2

重新产生您自己的界面。您可以复制ConversionService和Converter的界面,并以您喜欢的方式命名它们。当然,功能是相同的,但这会防止您的Converter类别插入任何其他ConversionService执行严修。

q7solyqu

q7solyqu4#

因为我在Spring集成中也遇到了这个问题,所以我对这个解决方案不是很满意,但这是一个快速的解决方案。

@Configuration
public class ConversionServiceConfiguration {

    @Bean
    @Primary
    public ConversionService rewardBoxConversionService(@Qualifier("mvcConversionService") final ConversionService conversionService) {
        return conversionService;
    }

}

如果您的某些逻辑需要其他ConversionService实现,则会出现问题。但是,这可以通过使用@Qualifier注解来解决。

相关问题