sourcecode

스프링 부트의 다중 변환 서비스

codebag 2023. 7. 22. 09:59
반응형

스프링 부트의 다중 변환 서비스

부팅 응용 프로그램이 있고 한 면에서 자동 배선을 시도합니다.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스프링 부츠에 어떤 것이 있는지 알려줄 방법이 있습니까?conversionService자동으로 변환기를 등록하는 데 사용할 수 있습니까?모든 변환기를 새 변환기로 수동으로 나열하지 않습니다.conversionService.

저도 비슷한 문제를 겪고 있었습니다.사용할 변환 서비스를 정의해야 하는 것이 문제인 것 같습니다.XML 또는 Spring Boot 구성을 사용하여 이 작업을 수행할 수 있습니다.

저는 매우 유사한 질문(제게 효과가 있었던 질문)에 대한 답변의 일부를 여기에 복사하고 이 질문을 중복 가능성이 있는 것으로 표시합니다.

Spring 문서를 살펴보면 다음과 같이 선언해야 합니다.ConversionServiceXML 구성에서는 다음과 같이 표시됩니다.

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

사용자가 찾고 있는 변환기 목록에서 모든 변환기가 목록에서 자동 배선할 수 있는 동일한 인터페이스를 구현하는 경우.

예.

@Service
public class MyService {

  @Autowired
  private List<MyConverter> myConverters;

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

}

필요에 따라 중간 정도로 반복합니다.

이 기능의 좋은 점은 새로운 구현이 추가될 때 이를 사용하는 코드를 업데이트할 필요가 없다는 것입니다.

설명.

Spring은 응용 프로그램에 대한 변환 서비스(mvcConversionService)를 자동으로 생성하려고 시도합니다.등록할 변환기에 대한 한정자가 없으므로 다음 유형 중 하나를 구현하는 구성 요소/빈을 생성하면 서비스에 자동으로 등록됩니다.

  1. 변환기
  2. 일반 변환기
  3. 프린터
  4. 파서

솔루션 #1

무시해요.이러한 변환기를 mvcConversionService에 등록해도 문제가 없다면 이 제한 사항을 해결할 시간이 없을 수도 있습니다.변환기 클래스가 사용되지 않을 수 있습니다.

솔루션 #2

자신의 인터페이스를 복제합니다.ConversionService 및 Converter의 인터페이스를 복사하고 원하는 이름을 지정할 수 있습니다.물론 기능은 동일하지만 Converter 클래스가 다른 ConversionService 인스턴스에 주입되는 것을 방지합니다.

Spring Integration에서도 이 문제를 겪고 있었기 때문에 이 문제에 부딪쳐 보십시오.나는 이 해결책에 만족하지 않지만 이것은 빠른 해결책입니다.

@Configuration
public class ConversionServiceConfiguration {

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

}

일부 논리에 대해 다른 ConversionService 구현이 필요한 경우 문제가 발생합니다.그러나 이는 @Qualifier 주석을 사용하여 해결할 수 있습니다.

언급URL : https://stackoverflow.com/questions/28111599/multiple-conversionservices-in-spring-boot

반응형