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.
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
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