java - Spring MVC validator 注解 + 自定义验证

标签 java spring validation spring-mvc

我正在开发 spring mvc 应用程序,我应该基于 Spring MVC validator 应用验证。我的第一步是为类和设置 Controller 添加注释,它工作正常。现在我需要实现自定义 validator 来执行复杂的逻辑,但我想使用现有的注释并添加额外的检查。

我的用户类:

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 :

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

那么,是否可以同时使用自定义 validator 和注释?如果是的话怎么做?

最佳答案

我知道这是一个老问题,但是对于谷歌人来说......

您应该使用 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 会清除现有(默认) validator ,因此 @Valid 注释不会按预期工作。

关于java - Spring MVC validator 注解 + 自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25075683/

相关文章:

ruby-on-rails - 将数据库约束转换为 Rails 验证

java - 使用 JAVA AdWords API 更新现有 Feed 记录

java - Spring @RestController 不使用 Kotlin 映射 URL

hibernate - Hibernate 和 Spring 的配置问题

java - Spring MVC(Spring 2.5)关于Post-Redirect-Get的问题

asp.net - 由于需要验证器,无法更改 asp 页面

java - Apache Camel zip 文件夹

java - 我可以使用从 Excel 行读取的不同变量集循环遍历我的程序吗?

java - 我使用Spring+MongoDB,当我执行查询方法时,它抛出java.lang.ClassNotFoundException : com. mongodb.MongoException$DuplicateKey

c++ - C++ 可执行文件的问题