我在这里有一个非常天真的概念问题需要澄清。在我的应用程序中,我目前正在使用JSR 303 Hibernate Validator来验证带有@NotBlank和@NotNull注释的域模型,比如检查用户名,密码等。
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;
...
但是为了验证像现有用户名这样的域逻辑,我仍然使用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 Validator而根本不使用Spring Validator来验证域逻辑?
答案 0 :(得分:17)
是的,您可以使用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;
...
答案 1 :(得分:2)
如果您使用<mvc:annotation-driven/>
配置Spring MVC,那么如果类路径中存在某些JSR 303验证器impl(例如,hibernate-validator),它将自动配置JSR 303 validator。
或者,如果您明确要配置验证程序,则可以执行以下操作:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
这将再次寻找JSR 303实现并将其用作验证器。
您可以通过以这种方式注册全局验证器来默认它来验证任何@Valid表单对象:
<mvc:annotation-driven validator="validator"/>