2014-01-16 1 views
1

컨트롤러가 5 개 있고 모두에 InitBinder을 등록하고 싶습니다.스프링 mvc 모든 컨트롤러에 대한 하나의 초기화 바인더

나는이 코드를 각각 추가 할 수 있음을 알고 있습니다.

@InitBinder 
public void initBinder(WebDataBinder binder) 
{ 
    binder.registerCustomEditor(StringWrapper.class, new StringWrapperEditor()); 
} 

그러나 난 단지 번 (심지어 StringWrapperEditor의 빈을 생성 할 때마다 새로운 만드는 대신 사용.)를 정의하고 싶습니다

내가 SO 검색 및 다른 장소 만 어떤 답을 찾지 못했습니다. 심지어 가능합니까?

자바 1.6과 함께 스프링 3.1.1을 사용하는 Im.

+1

  • PropertyEditorRegistrar javadoc, 당신은'@의 ControllerAdvice' 주석 클래스를 정의 할 수 있어야한다. –

  • +0

    메신저 봄 3.1.1을 사용하여 - 질문을 편집합니다 – Udy

    +1

    [여기] (http://forum.spring.io/forum/spring-projects/web/84541-application-wide-initbinder)를 참조하십시오. –

    답변

    2

    모든 사용자 정의 PropertyEditors을 등록하는 PropertyEditorRegistrar을 구현하십시오. 그런 다음 구성에 ConfigurableWebBindingInitializer을 추가하고 생성 된 PropertyEditorRegistrar으로 연결 한 다음 HandlerAdapter에 연결합니다. 당신이 당신의 구성에서 <mvc:annotation-driven /> 태그가있는 경우

    public class MyPropertyEditorRegistrar implements PropertyEditorRegistrar { 
    
        public void registerCustomEditors(PropertyEditorRegistry registry) { 
         registry.registerCustomEditor(StringWrapper.class, new StringWrapperEditor()); 
        } 
    } 
    

    는 문제는 ConfigurableWebBindingInitializer는 사전 구성된 HandlerAdapter에 추가 이미 거기에 그 옆에이 태그를 사용하면 어댑터에 WebBindingInitializer을 추가 할 수 있다는 것입니다. BeanPostProcessor을 사용하여 Bean을 처리하고 구성 할 수 있습니다.

    public class MyPostProcessor implements BeanPostProcessor { 
    
        public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException { 
         if (bean instanceof RequestMappingHandlerAdapter) { 
          WebBindingInitializer wbi = ((RequestMappingHandlerAdapter) bean).getWebBindingInitializer(); 
          if (wbi == null) { 
           wbi = new ConfigurableWebBindingInitializer(); 
           ((RequestMappingHandlerAdapter) bean).setWebBindingInitializer(wbi); 
          } 
    
          if (wbi instanceof ConfigurableWebBindingInitializer) { 
           ((ConfigurableWebBindingInitializer) wbi).setPropertyEditorRegistrar(new MyPropertyEditorRegistrar()); 
          } 
    
         } 
        } 
    
    } 
    

    약간의 작업이 필요하지만 수행 할 수 있습니다. 자신 만의 WebBindingInitializer을 구현할 수도 있습니다.

    태그가없는 경우 RequestMappingHandlerAdapter을 수동으로 구성하고 모든 것을 연결하기 만하면됩니다.

    링크

    1. 봄 3.2 이상으로 ConfigurableWebBindingInitializer javadoc
    2. 참조 가이드 link
    +0

    ''선언문이 자신의 '' 선언 앞이나 뒤에 선언을 생성하는지 알고 있습니까? 이전 버전 인 경우,'WebBindingInitializer'에 어떤 bean 이름을 사용했는지 알 수없고 그것을 덮어 쓰는 ''을 선언 할 수 있습니까? –

    +0

    나는 그것이 더 쉬울 것이라는 것을 희망했다 : 아프다 그것을 시도하십시오! – Udy

    +0

    당신은 @SotiriosDelimanolis가 제안하는 것처럼'RequestMappingHandlerAdapter' 대신에'ConfigurableWebBindingInitializer'를 감지하여 두 줄을 절약 할 수 있습니다. 'ConfigurableWebBindingInitializer'가 실제로 컨텍스트에 빈으로 추가되는지 확신 할 수는 없지만. –

    관련 문제