복붙노트

[SPRING] 변환기를 추가하는 Spring ConversionService

SPRING

변환기를 추가하는 Spring ConversionService

아래의 문제를 조사했지만 답을 찾을 수 없었습니다.

org.springframework.core.convert.converter.Converter를 구현하는 사용자 정의 변환기를 작성하여 Spring의 변환 서비스를 사용하려고합니다.

그럼 아래와 같이 내 사용자 지정 변환기를 추가합니다 :

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean id="StringToLoggerConverter" class="com.citi.spring.converter.LoggerConverter" />
       </list>
   </property>
</bean>

위의 작업을 수행 할 때 bean conversionService를 무시하고 사용자 정의 변환기 만 등록하기 때문에 응용 프로그램 초기화에 실패합니다.

conversionService를 재정의하지 않고 기존 사용자 정의 변환기를 유지하면서 동시에 변환기 목록에 사용자 지정 변환기를 추가 할 수 있습니까?

미리 감사드립니다.

해결법

  1. ==============================

    1.질문이 원래 게시 된 후 2 년이 넘는 Google 검색을 통해 지금이 문제에 직면 해있는 사람은 Java Config를 통해 변환기를 훨씬 쉽게 추가 할 수 있습니다. WebMvcConfigurerAdapter는 추가 사용자 지정을 지정하는 데 사용할 수있는 addFormatters (FormatterRegistry) 메서드를 제공합니다. 변환기.

    질문이 원래 게시 된 후 2 년이 넘는 Google 검색을 통해 지금이 문제에 직면 해있는 사람은 Java Config를 통해 변환기를 훨씬 쉽게 추가 할 수 있습니다. WebMvcConfigurerAdapter는 추가 사용자 지정을 지정하는 데 사용할 수있는 addFormatters (FormatterRegistry) 메서드를 제공합니다. 변환기.

  2. ==============================

    2.다른 방법으로 실험하고 일부에서는 스프링 소스 코드를 따르는 동안 흥미로운 일이 생겼습니다.

    다른 방법으로 실험하고 일부에서는 스프링 소스 코드를 따르는 동안 흥미로운 일이 생겼습니다.

    유일한 방법은 convertService 내 사용자 정의 가진 기존 변환기를 재정의하지 않고 사용하는 것으로 확장 또는 수퍼 클래스의 afterPropertiesSet () 메서드를 호출하는 conversionService 다시 구현하여 기본 변환기를 등록하고 사용자 지정 항목을 추가 할 수 있습니다.

    그러나 비록 내가 그런 식으로 사용했다하더라도, 런타임시 예외가 발생하여 특정 유형 (예 : String에서 Logger로)에 대한 변환기가 발견되지 않았습니다.

    이것이 내 관심사를 촉발 시켰고 스프링 소스 코드를 따라 봄에 PropertyEditor에 등록 된 사용자 정의 변환기를 찾으려고한다는 것을 알았습니다. 왜 이런 일이 일어나고 있는지 모르겠습니다. 여기에 내 응용 프로그램이 spring mvc를 사용하지 않고 conversionService가 어떻게 든 등록 될 필요가 있고 그것을하지 않았 음을 추가해야합니다.

    마지막으로 속성 편집기를 사용하여 사용자 지정 변환기를 등록하는 방법으로이 문제를 해결했습니다. 이 문서는 참조로 볼 수 있습니다.

    http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html

    나는 Spring이 conversionService의 레지스트리에 등록 된 사용자 정의 변환기를 찾지 못하는 이유 (또는 적어도 봄이 사용자 정의 변환기를 찾기 위해 레지스트리를보고 있지 않은 이유)를 아는 데 매우 관심이 있습니다. 구성이 누락 되었습니까?

  3. ==============================

    3.DefaultConversionService-ish 클래스에서 addConverter 메소드를 사용하여 동적으로 추가 할 수도 있습니다.

    DefaultConversionService-ish 클래스에서 addConverter 메소드를 사용하여 동적으로 추가 할 수도 있습니다.

    DefaultConversionService cs = new <YourClassThatInheritsFromDefaultConversionService or DefaultConversionService>();
    
    cs.addConverter(new MyConverter());
    
  4. ==============================

    4.Spring> 4를 사용하면 더 이상 ConversionService의 자체 파생을 구현할 필요가 없습니다. 다음과 같이 @Configuration 어노테이션이 적용된 클래스에서 초기화하십시오.

    Spring> 4를 사용하면 더 이상 ConversionService의 자체 파생을 구현할 필요가 없습니다. 다음과 같이 @Configuration 어노테이션이 적용된 클래스에서 초기화하십시오.

    @Configuration
    public class ConversionServiceProvider
    {
        @Autowired
        private MyConverterImpl myConverter;
    
        @Bean
        public ConversionService getConversionService()
        {
            ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
            bean.setConverters( getConverters() );
            bean.afterPropertiesSet();
            ConversionService object = bean.getObject();
            return object;
        }
    
        private Set<Converter<?, ?>> getConverters()
        {
            Set<Converter<?, ?>> converters = new HashSet<Converter<?, ?>>();
    
            converters.add( myConverter );
            // add here more custom converters, either as spring bean references or directly instantiated
    
            return converters;
        }
    }
    
  5. ==============================

    5.Stackoverflow에서이 작업을 수행하는 매우 흥미로운 방법을 찾아 왔습니다. - https://stackoverflow.com/a/12760579/204788

    Stackoverflow에서이 작업을 수행하는 매우 흥미로운 방법을 찾아 왔습니다. - https://stackoverflow.com/a/12760579/204788

    Collection merging이라는 기능을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.

    <bean id="customConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" parent="conversionService">
        <property name="converters">
            <list merge="true">
                <bean id="StringToLoggerConverter" class="com.citi.spring.converter.LoggerConverter" />
           </list>
       </property>
    </bean>
    
  6. ==============================

    6.ConversionServiceFactoryBean.afterPropertiesSet ()을 재정의하고 ConversionService 객체를 변환기로 설정하는 것으로 충분합니다. 변환기가 ConversionService 오브젝트를 설정할 수있는 인터페이스 (예 : ConversionServiceAware)를 구현하도록하십시오. 유일한 문제는 등록 된 변환기에 액세스하는 것이므로 'setConverters ()'메서드를 재정의해야합니다.

    ConversionServiceFactoryBean.afterPropertiesSet ()을 재정의하고 ConversionService 객체를 변환기로 설정하는 것으로 충분합니다. 변환기가 ConversionService 오브젝트를 설정할 수있는 인터페이스 (예 : ConversionServiceAware)를 구현하도록하십시오. 유일한 문제는 등록 된 변환기에 액세스하는 것이므로 'setConverters ()'메서드를 재정의해야합니다.

    public class MyFormattingConversionServiceFactoryBean extends FormattingConversionServiceFactoryBean {
    
        private Set<?> cachedConverters = new LinkedHashSet<>();
    
        @Override
        public void setConverters(Set<?> converters) {
            super.setConverters(converters);
            this.cachedConverters = new LinkedHashSet<>(converters);
    
        }
    
        @Override
        public void afterPropertiesSet() {
            super.afterPropertiesSet();
            FormattingConversionService conversionService = getObject();
            for (Object converter : cachedConverters) {
                if (converter instanceof ConversionServiceAware) {
                    ((ConversionServiceAware) converter).setConversionService(conversionService);
                }
            }
        }
    }
    
  7. ==============================

    7.맞춤 변환 서비스 작성

    맞춤 변환 서비스 작성

    public class CustomerConversionServiceFactoryBean extends ConversionServiceFactoryBean {
    
        List<Converter<Object, Object>> converters = new ArrayList<>();
    
        public CustomerConversionServiceFactoryBean() {
            super();
    
        DefaultConversionService conversionservice = (DefaultConversionService)  super.getObject();
    
            for(int i=0;i<converters.size();i++){
                conversionservice.addConverter(converters.get(i));
            }
        }
    }
    

    그런 다음 XML을 변경하십시오.

    <bean id="conversionService"
        class="CustomerConversionServiceFactoryBean" >
        <property name="converters" >
            <list>
                <bean class="CustomConverter"  />
            </list>
        </property>
    </bean>
    

    이게 너를 도울 것 같아.

  8. from https://stackoverflow.com/questions/12779329/spring-conversionservice-adding-converters by cc-by-sa and MIT license