2012-07-07 47 views
10

我有一个非常天真的概念性问题来澄清。在我的应用我目前使用JSR 303 Hibernate验证确认与@NotBlank和@NotNull注解域模型,如检查用户名,密码等使用JSR-303验证器而不是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; 
    ... 

但对于验证域逻辑类似现有的用户名,我“M仍然使用Spring的Validator接口

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

} 

在控制器中,我同时使用

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

    } 

是否可以只使用Hibernate的验证,而不是都使用Spring验证器验证域逻辑?

回答

15

是的,你可以使用JSR验证您的域逻辑验证。您需要定义自定义约束注释并在其中定义您的域逻辑验证。

定义定制约束注释了对定制标注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 {}; 
} 

定义验证。

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; 
    }  
} 
} 

使用自定义的注释

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

谢谢,那就是我一直在寻找的:-) – tintin 2012-07-08 10:28:56

+0

@tintin:很高兴我能帮忙:) – xyz 2012-07-08 10:32:32

2

如果您正在配置Spring MVC <mvc:annotation-driven/>,那么它将自动配置一个JSR 303 validator,如果某些JSR 303验证程序impl(例如,hibernate验证程序)存在于类路径中。

或者,如果你明确要配置的验证器,你可以这样做:

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

这再次将寻找一个JSR 303的实现和使用,作为验证。

可以默认情况下,通过注册全球验证这种方法来验证任何形式@Valid对象:

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

我觉得OP询问如何实现在JSR业务逻辑验证就像我们在春天验证定义。恕我直言,其关于在JSR-303中定义自定义注释,而你的答案谈论配置和使用JSR验证。如果我做出错误的假设,请纠正我。 – xyz 2012-07-08 09:44:48

相关问题