2012-07-07 25 views
10

Tôi có một câu hỏi khái niệm rất ngây thơ ở đây để làm rõ. Trong ứng dụng của tôi Tôi hiện đang sử dụng JSR 303 Hibernate Validator để phê chuẩn mô hình miền với @NotBlank và @NotNull chú thích, như kiểm tra tên truy cập, mật khẩu vvSử dụng trình xác thực JSR-303 thay vì Trình xác thực Spring

public class Admin { 

    private Long id; 
    @NotBlank(message = "Username should not be null") 
    private String username; 
    @NotBlank(message = "Username should not be null") 
    private String password; 
    ... 

Nhưng đối với việc chứng thực logic miền như tên người dùng hiện, tôi 'vẫn đang sử dụng giao diện Validator Spring

@Component 
public class AdminValidator implements Validator { 
    ... 
    @Override 
    public void validate(Object target, Errors errors) { 
    Admin admin = (Admin) target; 
    if (usernameAlradyExist())){ 
     errors.rejectValue("username", null, "This user already exist's in the system."); 
    } 

} 

Trong bộ điều khiển tôi đang sử dụng cả hai

@RequestMapping(value = "/register", method = RequestMethod.POST) 
public String register(@Valid @ModelAttribute("admin") Admin admin, BindingResult bindingResult,) { 
    validator.validate(admin, bindingResult); 
    if (bindingResult.hasErrors()) { 
     return REGISTER_ADMIN.getViewName(); 

    } 

có thể chỉ sử dụng Hibernate Validator và không phải là một t tất cả sử dụng Spring Validator để xác nhận hợp lệ logic miền?

Trả lời

15

Vâng, Bạn có thể sử dụng xác nhận JSR để xác nhận lý tên miền của bạn. Bạn cần xác định các chú thích ràng buộc tùy chỉnh và xác định xác thực hợp lệ miền của bạn bên trong nó.
Giống như
Xác định tùy chỉnh chế chú thích UserExistsConstraint

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy=UserExistsConstraintValidator.class) 

public @interface UserExistsConstraint { 
String message() default "This user already exist's in the system."; 
Class<!--?-->[] groups() default {}; 
Class<!--? extends Payload-->[] payload() default {}; 
} 

Xác định validator cho chú thích tùy chỉnh.

public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, object=""> { 

@Override 
public void initialize(UserExistsConstraint constraint) { 

} 

@Override 
public boolean isValid(Object target, ConstraintValidatorContext context) { 
    if (usernameAlradyExist()) 
    {  
    return false; 
    } 
    else 
    { 
    return true; 
    }  
} 
} 

Sử dụng tùy chỉnh chú thích

public class Admin { 

    private Long id; 
    @NotBlank(message = "Username should not be null") 
    @UserExistsConstraint 
    private String username; 
    @NotBlank(message = "Username should not be null") 
    private String password; 
    ... 
+0

Cảm ơn, đó là những gì tôi đang tìm kiếm :-) – tintin

+0

@tintin: Vui vì tôi có thể giúp :) – xyz

2

Nếu bạn định cấu hình Spring MVC với <mvc:annotation-driven/> thì nó sẽ tự động định cấu hình JSR 303 validator nếu một số trình xác nhận hợp lệ JSR 303 (hibernate-validator ví dụ) có trong đường dẫn lớp.

Hoặc nếu bạn dứt khoát muốn cấu hình validator, bạn có thể làm điều này:

<bean id="validator" 
     class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

này một lần nữa sẽ tìm kiếm một việc thực hiện JSR 303 và sử dụng như là validator.

Bạn có thể mặc nó để xác nhận bất kỳ đối tượng dạng @Valid bằng cách đăng ký một validator toàn cầu theo cách này:

<mvc:annotation-driven validator="validator"/> 
+1

Tôi nghĩ OP yêu cầu làm thế nào để thực hiện xác nhận logic kinh doanh trong JSR như chúng ta định nghĩa trong xác nhận mùa xuân. IMHO về việc xác định chú thích tùy chỉnh trong JSR-303 trong khi câu trả lời của bạn nói về việc định cấu hình và sử dụng xác thực JSR. Vui lòng sửa tôi nếu tôi đưa ra giả định sai. – xyz

Các vấn đề liên quan