2013-08-09 3 views
0

Я хочу добавить валидатор, который вернет ошибку, если значение не уникально. Как это сделать? Это мой текущий валидатор:Уникальная проверка столбца весной

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

    } 

Я хочу подтвердить название.

+0

_if значение не уникально_ Значение чего? Уникальный в отношении чего? –

+0

Титульный столбец должен быть уникальным из таблицы новостей. Не должно быть никаких новостей с одинаковыми названиями. –

ответ

0

Я не знаю, как вы делаете доступ к базе данных, вам, вероятно, следует добавить репозиторий, который запрашивает базу данных, чтобы проверить, существует ли название. Что-то вроде:

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

    } 
} 
+0

Это опасно. Поскольку проверка и любое действие репозитория, которое вы выполняете с проверяемым объектом, (возможно) не были выполнены в одной транзакции. Название может существовать сразу после проверки. –

+0

Это был пример в простейшей форме. Он, безусловно, должен добавить что-то, чтобы иметь возможность обрабатывать параллелизм. –

+0

Но как? Я не знаю –

Смежные вопросы