2009-06-14 9 views
12

Przeczytałem kilka książek na temat wiosennego 2.5 na ten temat, ale wciąż nie mogę uchwycić pojęć, kiedy używać @initBinder. czy ktokolwiek może udostępniać jakiekolwiek odniesienia lub wyjaśnić, w jakiej sytuacji mogę skorzystać z tego w aplikacji internetowej? Jak właściwości propertyEditor odnoszą się do niego?spring initBinder i webbindinginitializer example

Odpowiedz

14

Cóż, nie mogę tego tak naprawdę opisać lepiej niż książki, ale jeśli kontroler posiada jakiekolwiek publiczne metody opatrzone adnotacją @InitBinder, wówczas te metody będą wywoływane przez kontener tuż przed przetworzeniem każdego wniosku, przekazując WebDataBinder jest używany przez framework.

Najczęstszym powodem jest to, aby dostosować sposób, w jaki Spring próbuje powiązać parametry żądania z modelem, na przykład, jeśli model ma niestandardowe typy danych, których Spring nie może obsługiwać po rozpakowaniu. Rejestrujesz PropertyEditors przeciwko WebDataBinder. Trywialnym przykładem może być użycie biblioteki JodaTime w modelu i powiązanie sygnatur znacznika czasu z obiektem Joda DateTime.

Używając Spring 2.0, musisz zastąpić chronioną metodę initBinder() nadrzędną kontrolera, ale Spring 2.5 usuwa to, możesz teraz użyć adnotacji.

7

Innym powodem obok co skaffman wspomniano, byłoby ustawić niestandardowy walidator na swoim WebDataBinder. Zazwyczaj używam sprawdzania fasoli JSR-303, a następnie wiążę walidator, który zapewnia dodatkową weryfikację, której nie zapewnia JSR-303.

Wewnątrz kontrolera:

@InitBinder 
protected void initBinder(WebDataBinder webDataBinder) { 
    Validator validator = webDataBinder.getValidator(); 
    webDataBinder.setValidator(new UserFormValidator(validator)); 
} 

Co robię bierze w walidator fasoli, nazywając że w moim niestandardowego walidatora, a następnie wywołanie moich niestandardowych walidacji. Coś takiego:

public class UserFormValidator implements Validator { 

    private Validator validator; 

    public AuthUserFormValidator(Validator validator) { 
     this.validator = validator; 
    } 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return UserForm.class.equals(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 

     // Run the bean validation... 

     validator.validate(target, errors); 

     // Do your custom validation on userForm here... 

     UserForm userForm = (UserForm) target; 

     // Validation on userForm... 
    } 
}