2012-02-07 6 views
5

웹 요청을 모델 객체에 바인딩하는 것과 관련하여 Spring의 DataBinder 및 ConversionService 사용 및 목적에 다소 혼란을 겪고 있습니다. JSR-303 유효성 검사를 최근에 추가하여 사용하려고했기 때문에이 문제가 발생했습니다. 이것에Spring에서 DataBinder와 ConversionService의 차이점

이전에 내가 사용 : 나는 여러 컨트롤러에서 사용할 수있는 글로벌 DataBinder를 원하기 때문에

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="mypackage.GlobalWebBindingInitializer" /> 
    </property> 
</bean> 

는 좋았다. GlobalWebBindingInitialzer 클래스 내에서 다음의 몇 가지 구현 :

binder.registerCustomEditor(MyClass.class, new PropertyEditorSupport(MyClass.class) 

나는 @Valid 주석을 사용하고 싶었 등 추가 그러나. 부작용은 위의 AnnotationMethodHandlerAdapter bean이 이미 annotation-driven의 일부로 정의되어 있으므로 내 전역 데이터 바인더가 무시된다는 것입니다.

public class MyClassConverter implements Converter<String, MyClass> 

내가 혼란 스러워요 :

은 그래서 지금은이 클래스를 만들었습니다. databinder보다는 변환 서비스를 사용해야합니까?

답변

3

이전에는 스프링의 데이터 바인딩이 데이터를 javabeans로 변환하는 데 사용되었습니다. 변환을 수행하기 위해 JavaBean PropertyEditors에 크게 의존합니다.

변환 및 형식 지정. 일부 변경 사항에는 "core.convert"패키지와 "format"패키지가 포함되어 있으며 문서별로 "PropertyEditors에 대한 간단한 대안으로 사용할 수 있습니다."

질문에 대답하려면 네가 올바른 길을 가고있는 것처럼 보입니다. 둘 중 하나를 계속 사용할 수는 있지만 대부분의 경우 길게 쓰려면 데이터 바인더 대신 변환기를 사용할 수 있어야합니다.

유효성 검사 추가 방법에 대한 문서 is available online.

1

위의 대답에 대한 추가 정보 PropertyEditors (esp PropertyEditorSupport)는 스레드 안전성이 아니며 특히 각 요청이 별도의 스레드에서 제공되는 웹 환경에서 필요합니다. 이론적으로, PropertyEditors는 매우 동시적인 조건 하에서 예기치 않은 결과를 가져와야합니다.

하지만 스프링이 PropertyEditors를 처음 사용하는 이유를 모르겠습니다. SpringMVC 이전의 비 멀티 쓰레드 환경과 날짜를 의미 할 수 있습니까?

편집 :

,하지만 PropertyEditorSupport이 스레드 보이지 않는 안전한 봄 보장의 스레드 안전한 방식으로 사용된다. 예를 들어, initBinder()는 데이터 바인딩이 필요할 때마다 호출됩니다. 컨트롤러가 초기화 될 때 한 번만 호출된다는 생각은 잘못되었습니다.

@InitBinder 
public void initBinder(WebDataBinder binder) { 

    logger.info("initBinder() called."); 

    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm"); 
    dateFormat.setLenient(false); 

    binder.registerCustomEditor(Date.class, new CustomDateEditor(
      dateFormat, false)); 
} 

여기에 "initBinder()"라는 로그가 있습니다. 바인딩이 발생할 때마다 여러 번 나타날 수 있습니다.

관련 문제