【问题标题】:Unique column validator in SpringSpring中唯一的列验证器
【发布时间】:2013-08-09 18:55:26
【问题描述】:

我想添加验证器,如果值不唯一,它将返回错误。这该怎么做?这是我当前的验证器:

@Component
public class AddFormValidator implements Validator {
    public boolean supports(Class<?> clazz) {
        return AddForm.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
        AddForm addForm = (AddForm) target;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title",
                "title.empty", "Title must not be empty.");
        String title = addForm.getTitle();
        if ((title.length()) > 30) {
            errors.rejectValue("title", "title.tooLong",
                    "Title must not more than 16 characters.");
        }

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "content",
                "content.empty", "Content must not be empty.");
        String content = addForm.getContent();
        if ((content.length()) > 10000) {
            errors.rejectValue("content", "content.tooLong",
                    "Content must not more than 10K characters.");
        }

    }

我想验证标题。

【问题讨论】:

  • 如果值不是唯一的 值是什么?在什么方面独一无二?
  • 标题列在新闻表中必须是唯一的。不得有相同标题的新闻。

标签: java spring unique validation


【解决方案1】:

我不知道您是如何访问数据库的,您可能应该注入一个查询数据库的存储库以检查标题是否已经存在。类似的东西:

@Component
public class AddFormValidator implements Validator {

    @Autowired
    NewsRepository newsRepository;       

    public boolean supports(Class<?> clazz) {
        return AddForm.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
        AddForm addForm = (AddForm) target;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title",
                "title.empty", "Title must not be empty.");
        String title = addForm.getTitle();
        if ((title.length()) > 30) {
            errors.rejectValue("title", "title.tooLong",
                    "Title must not more than 16 characters.");
        }

        New new = newsRepository.findByTitle(title);
        // New already exist
        if (new != null) {
            errors.rejectValue("title", "title.alreadyExist",
                    "New title already exist");
        }

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "content",
                "content.empty", "Content must not be empty.");
        String content = addForm.getContent();
        if ((content.length()) > 10000) {
            errors.rejectValue("content", "content.tooLong",
                    "Content must not more than 10K characters.");
        }

    }
}

【讨论】:

  • 这很危险。因为检查以及您随后对已验证对象执行的任何存储库操作将(可能)不会在同一事务中完成。标题可能会在您检查后立即存在。
  • 这是一个最简单的例子。他当然必须添加一些东西才能处理并发
  • 但是怎么做呢?我不知道
  • 这取决于您的用例...我不知道您在验证对象后对它做了什么。你在使用 JPA 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2020-12-10
  • 2011-06-19
  • 2012-10-10
  • 2020-04-30
相关资源
最近更新 更多