2011-12-22 15 views
9

Tworzę aplikację demonstracyjną przy użyciu narzędzia spring mvc 3.0. Muszę zastosować sprawdzanie poprawności na ekranie. Wyszukiwanie w sieci i stwierdzenie, że są używane głównie dwa typy sprawdzania poprawności zastosowanie: - walidacjiSprawdzanie poprawności sprężyny kontra hibernacji przy użyciu adnotacji

  1. Wiosna za pomocą walidacji Api
  2. walidacji Hibernacja przy użyciu hibernacji validations

Mam nadzieję, że ktoś mi dać sugestię których jeden jest dobry, aby zaimplementować w aplikacji.

Odpowiedz

9

Użyłem obu - lubię Hibernate Validation więcej - całkiem łatwe do wdrożenia i dość standardowe. Jest on automatycznie włączany, gdy masz implementację w ścieżce klas. Oto przykład:

@EmailValidator 
@NotBlank 
@Length(max=65) 
private String email; 

Skąd pochodzi komunikat Error String? W WEB-INF trzeba mieć plik o nazwie messages.properties:

NotBlank.ForgotPasswordBackingObject.email=Email address must be present 

Jest to standardowy @Email adnotacja, ale e-mail, takie jak: me @ MyCompany jest uważany za ważny, dlatego musiałem zrobić mój własne @EmailValidator (zmieniono flagę regex z * na + w standardowej implementacji). Są pewne kwestie, które natknąłem: Kolejność walidacji - walidacja który chcesz zdarzyć pierwsze, odbywa się to z grupami walidacji, ale to nie jest to możliwe z @Valid adnotacji, na przykład:

@RequestMapping(method=RequestMethod.POST, value="/auth/changePassword") 
public ModelAndView submitChangePasswordPage(@Valid @ModelAttribute("ChangePasswordBackingObject") ChangePasswordBackingObject backingObject, BindingResult result, Principal principal) 

Dlatego jeśli masz kontroler w tej formie (na przykład w Spring MVC), musisz symulować swoją logikę w pewien sposób - ja też to zrobiłem.

Kolejna fajna rzecz, że można zrobić to do Weryfikacja dwa lub więcej pól w momencie (co uważam za bardzo przydatne):

@FieldMatch.List({ 
    @FieldMatch(firstValue = "password" , secondValue = "confirmPassword") 
}) 
public class RequestAccountBackingObject implements Serializable { 
    private String password; 
    private String confirmPassword; 

i wdrożenie:

@Target({TYPE, ANNOTATION_TYPE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = FieldMatchImpl.class) 
@Documented 
public @interface FieldMatch{ 
    String message() default "{com.errorMessage}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
    String firstValue(); 
    String secondValue(); 
    @Target({TYPE, ANNOTATION_TYPE}) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List 
    { FieldMatch[] value(); } 
} 

Drugi FieldMatchImpl będzie:

public class FieldMatchImpl implements ConstraintValidator<FieldMatch, Object>{ 
    private String firstFieldName; 
    private String secondFieldName; 

i potrzebujesz dwóch wdrożonych metod:

public void initialize(final FieldMatch constraintAnnotation){ 
    firstFieldName = constraintAnnotation.firstValue(); 
    secondFieldName = constraintAnnotation.secondValue(); 

również:

public boolean isValid(final Object value, final ConstraintValidatorContext context){ 

    final String firstObj = BeanUtils.getProperty(value, firstFieldName); 
    final String secondObj = BeanUtils.getProperty(value, secondFieldName); 

Korzystanie org.apache.commons.beanutils.BeanUtils można teraz sprawdzić poprawność dwa pola.

Jak to:

boolean result = firstObj.equals(secondObj); 
if(!result) { 
    context.disableDefaultConstraintViolation(); 
    context.buildConstraintViolationWithTemplate(errorMessage).addNode(firstFieldName).addConstraintViolation(); 
} 

Inne następnie, że została ona przyjemność korzystania z hibernacji Validation tak daleko.

+0

Dzięki za udzielenie dobrego zrozumienia odpowiedzi Eugene, a co z inną walidacją ..? – Anshul

+0

Chciałbym móc szczegółowo odpowiedzieć, ale minęło dużo czasu odkąd użyłem Weryfikacji wiosennej.:(A ponieważ JSR 303 stał się specyfikacją i Hibernate Validator implementacją referencyjną, naprawdę myślę, że Spring obróci się w tym samym kierunku. – Eugene

Powiązane problemy