Я нашел какое-то хитрое решение.
Во-первых, я применил уникальное противопоставление к моей базе данных MySql:
CREATE TABLE XMLTAG
(
ID INTEGER NOT NULL AUTO_INCREMENT,
LABEL VARCHAR(64) NOT NULL,
XPATH VARCHAR(128),
PRIMARY KEY (ID),
UNIQUE UQ_XMLTAG_LABEL(LABEL)
) ;
Вы видите, что я управляю тегами XML, которые определены уникальной меткой и текстовым полем с именем "XPath".
В любом случае, второй шаг - просто перехватить ошибку, возникшую, когда пользователь пытается выполнить плохое обновление. Плохое обновление - это попытка заменить текущую метку существующей. Если вы оставите этикетку нетронутой, нет проблем. Итак, в моем контроллере:
@RequestMapping(value = "/updatetag", method = RequestMethod.POST)
public String updateTag(
@ModelAttribute("tag") Tag tag,
@Valid Tag validTag,
BindingResult result,
ModelMap map) {
if(result.hasErrors()) { // you don't care : validation of other
return "editTag"; // constraints like @NotEmpty
}
else {
try {
tagService.updateTag(tag); // try to update
return "redirect:/tags"; // <- if it works
}
catch (DataIntegrityViolationException ex) { // if it doesn't work
result.rejectValue("label", "Unique.tag.label"); // pass an error message to the view
return "editTag"; // same treatment as other validation errors
}
}
}
Это может конфликтовать с шаблоном @Unique, но вы можете использовать этот грязный метод и для проверки правильности добавления.
Примечание: есть еще одна проблема: если другие ошибки проверки обнаруживаются до исключения, сообщение об уникальности не будет отображаться.