Проверка ошибок Thymeleaf JPA с использованием VO

Я использую тимелеаф + sprintboot для веб-приложения, и мне интересно, как я могу контролировать ошибки проверки, когда я использую объекты значений (VO).

Как видите, сущность имеет ограничение (уникальное) для одного атрибута:

@Entity
public class Company {

    @Id
    @GeneratedValue
    Integer id = 0;
    @Column(unique = true)
    String code;
    String name;
    String address;
...
}

Но на ВО он не предназначен:

public class CompanyVO {

    Integer id = 0;
    String code;
    String name;
    String address;
...
}

следовательно, контроллер не может проверить, является ли значение повторяющимся или уникальным:

@RequestMapping(method = RequestMethod.POST)
public String set(@Valid CompanyVO companyVO, BindingResult result, Model model){

    Company company = new Company();

    if(result.hasErrors()){
        return "company";
    }

    if(companyVO.getId() != 0){
        company = companyRepository.findOne(companyVO.getId());
    }

    mapper.map(companyVO, company);
    companyRepository.save(company);
    return "redirect:/companies";
}

Как я могу показать ошибки проверки в представлении, когда я использую VO?


person Michael Knight    schedule 22.05.2016    source источник


Ответы (1)


У вас действительно есть только один вариант. Чтобы перехватить исключение из Hibernate/DB о повторяющемся значении и заполнить любые дополнительные ошибки в BindingResult.

Выполнение запроса вводит состояние гонки. Если 2 пользователя пытаются ввести одно и то же значение примерно в одно и то же время, обе проверки могут быть пройдены (поскольку в базе данных еще нет значения), а одна из них позже завершится ошибкой, так как только одна транзакция сможет завершиться успешно.

Когда вы поймаете исключение, вы можете вызвать BindingResult.addError с FieldError, который содержит имя поля и сообщение об ошибке.

person Augusto    schedule 22.05.2016