2012-02-07 13 views
5

Mam pewne zamieszanie w używaniu i celach Spring DataBinder i ConversionService w odniesieniu do wiążących żądań internetowych do obiektów modelu. Stało się tak, ponieważ ostatnio próbowałem użyć sprawdzania poprawności JSR-303, dodając.Różnica między DataBinderem a usługą ConversionService na wiosnę

Wcześniej użyłem:

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

To było dobre, ponieważ chciałem globalną DataBinder które mogłyby być wykorzystane przez kilka sterowników. W klasie GlobalWebBindingInitialzer wdrożyć kilka z nich:

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

Jednak chciałem użyć @Valid adnotacji i tak dodaje. Efektem ubocznym tego jest to, że powyższy komponent bean AnnotationMethodHandlerAdapter jest już zdefiniowany jako część adnotacji, więc mój globalny segregator danych jest ignorowany.

Więc teraz ja stworzyliśmy tę klasę:

public class MyClassConverter implements Converter<String, MyClass> 

jestem zdezorientowany. Jeśli chcę użyć, czy powinienem używać usługi konwersji zamiast databinder?

Odpowiedz

3

Historycznie wiązanie danych Spring było używane do konwersji danych na javabeans. W dużej mierze opiera się na JavaBean PropertyEditors, aby wykonać konwersję.

Spring 3.0 added new and different support dla konwersji i formatowania. Niektóre zmiany obejmowały pakiet "core.convert" i "format", które zgodnie z dokumentami "mogą być używane jako prostsze alternatywy dla PropertyEditors."

Teraz, aby odpowiedzieć na twoje pytanie, tak, wygląda na to, że jesteś na dobrej drodze. Możesz dalej używać, ale w wielu przypadkach powinieneś być w stanie użyć konwertera zamiast segregatora danych.

Dokumentacja dotycząca dodawania potwierdzenia is available online.

1

W odpowiedzi na powyższe problemy PropertyEditors (esp PropertyEditorSupport) nie są bezpieczne dla wątków, co jest szczególnie wymagane w środowisku sieci Web, w którym każde żądanie jest obsługiwane w osobnym wątku. Teoretycznie, PropertyEditors powinny dawać nieprzewidywalne wyniki w wysoce współbieżnych warunkach.

Ale nie jestem pewien, dlaczego Spring użył PropertyEditors w pierwszej kolejności. Może to być przeznaczone dla środowisk nie wielowątkowych i dat przed SpringMVC?

EDIT:

Chociaż PropertyEditorSupport nie wygląda wątku bezpieczne Wiosna zapewnia jej stosować w sposób bezpieczny wątku. Na przykład initBinder() jest wywoływana za każdym razem, gdy potrzebne jest powiązanie danych. Myliłem się, sądząc, że wywołano go tylko raz, gdy sterownik został zainicjowany.

@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)); 
} 

Tutaj rejestruje się komunikat "initBinder()". może pojawić się wiele razy, gdy tylko pojawi się powiązanie.

Powiązane problemy