Spring MVC验证器注释+自定义验证

我正在研究Spring MVC应用程序,我应该在此基于Spring

MVC验证器进行验证。我的第一步是为类和安装程序控制器添加了注释,并且工作正常。现在,我需要实现自定义验证器以执行复杂的逻辑,但是我想使用现有的批注并仅添加其他检查。

我的用户类别:

public class User

{

@NotEmpty

private String name;

@NotEmpty

private String login; // should be unique

}

我的验证人:

@Component

public class UserValidator implements Validator

{

@Autowired

private UserDAO userDAO;

@Override

public boolean supports(Class<?> clazz)

{

return User.class.equals(clazz) || UsersForm.class.equals(clazz);

}

@Override

public void validate(Object target, Errors errors)

{

/*

ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "NotEmpty.user");

ValidationUtils.rejectIfEmptyOrWhitespace(errors, "login", "NotEmpty.user");

*/

User user = (User) target;

if (userDAO.getUserByLogin(user.getLogin()) != null) {

errors.rejectValue("login", "NonUniq.user");

}

}

}

我的控制器:

@Controller

public class UserController

{

@Autowired

private UserValidator validator;

@InitBinder

protected void initBinder(final WebDataBinder binder)

{

binder.setValidator(validator);

}

@RequestMapping(value = "/save")

public ModelAndView save(@Valid @ModelAttribute("user") final User user,

BindingResult result) throws Exception

{

if (result.hasErrors())

{

// handle error

} else

{

//save user

}

}

}

因此,可以同时使用自定义验证程序和注释吗?如果是的话,怎么办?

回答:

我知道这是一个古老的问题,但对于Google员工来说…

您应该使用addValidators而不是setValidator。如下所示:

@InitBinder

protected void initBinder(final WebDataBinder binder) {

binder.addValidators(yourCustomValidator, anotherValidatorOfYours);

}

PS:addValidators接受多个参数(省略号)

如果您org.springframework.validation.DataBinder查看来源,您将看到:

public class DataBinder implements PropertyEditorRegistry, TypeConverter {

....

public void setValidator(Validator validator) {

assertValidators(validator);

this.validators.clear();

this.validators.add(validator);

}

public void addValidators(Validator... validators) {

assertValidators(validators);

this.validators.addAll(Arrays.asList(validators));

}

....

}

如您所见,setValidator清除了现有的(默认)验证器,因此@Valid注释无法按预期工作。

以上是 Spring MVC验证器注释+自定义验证 的全部内容, 来源链接: utcz.com/qa/411274.html

回到顶部