Проблемы с валидацией

220
01 ноября 2019, 17:30

При добавлении invNum которого нету в базе все работает и добавляется, а вот если есть уже такой в базе то ошибка! класс валидации

@Component("bookValidator")
public class BookValidator implements Validator {
@Autowired
private CatalogBooksService catalogBooksService;
@Override
public boolean supports(Class<?> aClass) {
    return CatalogBooks.class.equals(aClass);
}
@Override
public void validate(@Nullable Object o, Errors errors) {
    CatalogBooks catalogBooks = (CatalogBooks) o;
    if (catalogBooksService.getCatalogBookByInvNum(catalogBooks.getInvNum()) != null){
        errors.rejectValue("invNum","jjj","Книга с таким инвентарным номером уже существует!");
    }
}

}

так получаю из базы существующий номер

 @Override
public CatalogBooks getCatalogBookByInvNum(int invNum) {
    CatalogBooks catalogBooks = (CatalogBooks) currentSession().createQuery("from CatalogBooks c where c.invNum =:inv")
            .setParameter("inv",invNum)
            .setMaxResults(1)
            .uniqueResult();
    return catalogBooks;
}

это контроллер

 @RequestMapping(value = "/bookAdd", method = RequestMethod.POST)
public String bookNew(@ModelAttribute @Valid CatalogBooks catalogBooks,
                        @ModelAttribute Category category,
                      BindingResult bindingResult,
                      Model model){
     bookValidator.validate(catalogBooks, bindingResult);
    if (bindingResult.hasErrors()){
        Map<String, String> errorsMap = ControllerUtils.getErrors(bindingResult);
        model.addAttribute("errorsMap", errorsMap);
        model.addAttribute("book", catalogBooks);
        model.addAttribute("category", categoryService.categoryList());
    }else {
        Category category1 = categoryService.getCategory(category.getId_Category());
        catalogBooks.setCategory(category1);
        catalogBooksService.addCatalogBook(catalogBooks);
        model.addAttribute("addOk", true);
    }
    model.addAttribute("category", categoryService.categoryList());
    return "/bookAdd";
}

Выскакивает ошибка

класс Category

@Entity
@Table(name = "categoryes")
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "id_category")
private int id_Category;
@Column (name = "name")
private String categoryName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "category")
private Set<CatalogBooks> catalogBooks;
public Category() {
}
public int getId_Category() {
    return id_Category;
}
public void setId_Category(int id_Category) {
    this.id_Category = id_Category;
}
public String getCategoryName() {
    return categoryName;
}
public void setCategoryName(String categoryName) {
    this.categoryName = categoryName;
}
public Set<CatalogBooks> getCatalogBooks() {
    return catalogBooks;
}
public void setCatalogBooks(Set<CatalogBooks> catalogBooks) {
    this.catalogBooks = catalogBooks;
}
@Override
public String toString() {
    return "Category{" +
            "id_Category=" + id_Category +
            ", categoryName='" + categoryName + '\'' +
            //", catalogBooks=" + catalogBooks +
            '}';
}

}

класс CatalogBooks

@Entity
@Table(name = "catalog_books")
public class CatalogBooks {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_catalog_book")
private int id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "category_id")
private Category category;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "catalogBooks")
Set<Give> gives;
@NotBlank(message = "Название книги не может быть пустым")
@Column (name = "name")
private String name;
@Column (name = "author")
private String author;
@Column (name = "year")
private int year;
@Column (name = "inv_num")
private int invNum;
@Column (name = "count_book")
private int countBook;
public CatalogBooks(){
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public Category getCategory() {
    return category;
}
public void setCategory(Category category) {
    this.category = category;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getAuthor() {
    return author;
}
public void setAuthor(String author) {
    this.author = author;
}
public int getYear() {
    return year;
}
public void setYear(int year) {
    this.year = year;
}
public int getInvNum() {
    return invNum;
}
public void setInvNum(int invNum) {
    this.invNum = invNum;
}
public int getCountBook() {
    return countBook;
}
public void setCountBook(int countBook) {
    this.countBook = countBook;
}
@Override
public String toString() {
    return "CatalogBooks{" +
            "id=" + id +
            ", category=" + category +
            ", name='" + name + '\'' +
            ", author='" + author + '\'' +
            ", year=" + year +
            ", invNum=" + invNum +
            ", countBook=" + countBook +
            '}';
}

}

Answer 1

@ModelAttribute Category category, надо было ставить после BindingResult bindingResult,

@RequestMapping(value = "/bookAdd", method = RequestMethod.POST)
public String bookNew(@ModelAttribute @Valid CatalogBooks catalogBooks,
                      BindingResult bindingResult,
                      @ModelAttribute Category category,
                      Model model){
READ ALSO
Вопрос касательно java Annotation и Reflection

Вопрос касательно java Annotation и Reflection

Здраствуйте, у меня вопрос, У меня есть множество классов помеченые какой то анотацией, мне нужно все класы которие помечение анотацией засунуть...

167
Зачем нужен статический метод?

Зачем нужен статический метод?

Знаю, что переменные static как бы общие для всех классов и являются единственным экземпляромНо зачем нам нужны статические методы ? И почему...

234
Парсинг fb2 в markdown java [закрыт]

Парсинг fb2 в markdown java [закрыт]

Появился вопрос конвертации текста из fb2 в markdownСамый легкий способ который мне приходит на ум это просто использование стандартных функций...

108
Spring security google token authorization

Spring security google token authorization

Реализовываю rest api с авторизацией через гуглАвторизация проходит, но дальнейшее обращение к эндпойнтам происходит на основании сессии, а не через...

217