2011-12-22 5 views
9

tôi đang tạo một ứng dụng demo bằng cách sử dụng mvc mùa xuân 3.0.I phải áp dụng xác thực trên màn hình.I tìm kiếm trên mạng và thấy rằng có 2 loại xác thực được sử dụng với ứng dụng: - validationsXác nhận hợp lệ mùa xuân và xác thực Hibernate bằng cách sử dụng chú thích

  1. mùa xuân sử dụng kiểm chứng thực Api
  2. Hibernate xác nhận sử dụng Hibernate kiểm chứng thực

Hy vọng rằng ai đó cho tôi đề nghị đó là một trong những tốt để thực hiện trong ứng dụng.

Trả lời

9

Tôi đã sử dụng cả hai - Tôi thích Hibernate Validation nhiều hơn - khá dễ thực hiện và khá chuẩn. Nó được tự động kích hoạt khi bạn có một triển khai trên classpath. Dưới đây là ví dụ:

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

Chuỗi thông báo đến từ đâu? Trong WEB-INF bạn phải có một tập tin gọi là messages.properties:

NotBlank.ForgotPasswordBackingObject.email=Email address must be present 

Có một chú thích @Email tiêu chuẩn, nhưng một email như: me @ mycompany được coi là hợp lệ, đó là lý do tại sao tôi phải làm cho tôi @EmailValidator của riêng mình (đã thay đổi cờ regex từ * thành + trong triển khai chuẩn). Có một số vấn đề mà tôi đi qua: trình tự xác nhận - trong đó xác nhận bạn muốn xảy ra đầu tiên, điều này được thực hiện với nhóm Validation, nhưng điều này là không thể với các chú thích @Valid, ví dụ:

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

Đó là lý do tại sao nếu bạn có Bộ điều khiển của bạn ở dạng này (ví dụ như trong MVC của Spring), thì bạn phải mô phỏng logic của mình theo cách - tôi cũng đã làm điều đó.

Một điều thú vị mà bạn có thể làm điều đó để Validate hai hoặc nhiều lĩnh vực tại lúc (mà tôi tìm thấy khá hữu ích):

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

Và việc thực hiện:

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

Các FieldMatchImpl khác sẽ là:

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

và bạn cần hai phương pháp được triển khai:

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

Ngoài ra:

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

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

Sử dụng org.apache.commons.beanutils.BeanUtils bây giờ bạn có thể xác nhận hai trường.

Như thế này:

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

khác sau đó nó đã được một niềm vui bằng cách sử dụng Validation Hibernate cho đến nay.

+0

Cảm ơn bạn đã trả lời sự hiểu biết tốt Eugene, Còn về xác thực khác .. thì sao? – Anshul

+0

Tôi ước gì tôi có thể nêu chi tiết câu trả lời cho bạn, nhưng đã lâu rồi kể từ khi tôi sử dụng Xác nhận mùa xuân.:(Và kể từ khi JSR 303 trở thành đặc điểm kỹ thuật và Hibernate Validator việc thực hiện tham chiếu, tôi thực sự nghĩ rằng Spring sẽ biến chính nó theo cùng một hướng. – Eugene