[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.질문이 원래 게시 된 후 2 년이 넘는 Google 검색을 통해 지금이 문제에 직면 해있는 사람은 Java Config를 통해 변환기를 훨씬 쉽게 추가 할 수 있습니다. WebMvcConfigurerAdapter는 추가 사용자 지정을 지정하는 데 사용할 수있는 addFormatters (FormatterRegistry) 메서드를 제공합니다. 변환기.
질문이 원래 게시 된 후 2 년이 넘는 Google 검색을 통해 지금이 문제에 직면 해있는 사람은 Java Config를 통해 변환기를 훨씬 쉽게 추가 할 수 있습니다. WebMvcConfigurerAdapter는 추가 사용자 지정을 지정하는 데 사용할 수있는 addFormatters (FormatterRegistry) 메서드를 제공합니다. 변환기.
-
==============================
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.DefaultConversionService-ish 클래스에서 addConverter 메소드를 사용하여 동적으로 추가 할 수도 있습니다.
DefaultConversionService-ish 클래스에서 addConverter 메소드를 사용하여 동적으로 추가 할 수도 있습니다.
DefaultConversionService cs = new <YourClassThatInheritsFromDefaultConversionService or DefaultConversionService>(); cs.addConverter(new MyConverter());
-
==============================
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.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.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.맞춤 변환 서비스 작성
맞춤 변환 서비스 작성
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>
이게 너를 도울 것 같아.
from https://stackoverflow.com/questions/12779329/spring-conversionservice-adding-converters by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 쉘을 사용하여 스프링 부트 웹 애플리케이션에서 콘솔 명령을 작성하는 방법은 무엇입니까? (0) | 2019.03.20 |
---|---|
[SPRING] Spring App을 Websphere에 배치 할 수 없다. (0) | 2019.03.20 |
[SPRING] 유효성 검사 주석을 제어하려면? (0) | 2019.03.20 |
[SPRING] @Autowired - 적어도 하나의 bean에 의존성을 위해 발견 된 유형의 적격 bean이 없습니다. (0) | 2019.03.20 |
[SPRING] Spring의 @Configuration과 @Component의 차이점은 무엇입니까? (0) | 2019.03.20 |