Validation 使用VO';s

Validation 使用VO';s,validation,spring-boot,thymeleaf,bean-validation,Validation,Spring Boot,Thymeleaf,Bean Validation,我正在为一个web应用程序使用thymeleaf+sprinboot,我想知道在使用值对象(VO)时如何控制验证错误 如您所见,实体对一个属性具有约束(唯一): @Entity public class Company { @Id @GeneratedValue Integer id = 0; @Column(unique = true) String code; String name; String address; ... } 但

我正在为一个web应用程序使用thymeleaf+sprinboot,我想知道在使用值对象(VO)时如何控制验证错误

如您所见,实体对一个属性具有约束(唯一):

@Entity
public class Company {

    @Id
    @GeneratedValue
    Integer id = 0;
    @Column(unique = true)
    String code;
    String name;
    String address;
...
}
但VO不打算拥有它:

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时,如何在视图上显示验证错误?

您实际上只有一个选项。从Hibernate/DB捕获关于重复值的异常,并在BindingResult中填充任何额外错误

执行查询会引入竞争条件。如果两个用户尝试在大致相同的时间输入相同的值,两个验证都可以通过(因为数据库中还没有值),其中一个稍后将失败,因为只有一个事务能够成功


捕获异常时,可以使用包含字段名和错误消息的
FieldError
调用
BindingResult.addError

您实际上只有一个选项。从Hibernate/DB捕获关于重复值的异常,并在BindingResult中填充任何额外错误

执行查询会引入竞争条件。如果两个用户尝试在大致相同的时间输入相同的值,两个验证都可以通过(因为数据库中还没有值),其中一个稍后将失败,因为只有一个事务能够成功

捕获异常时,可以使用包含字段名和错误消息的
FieldError
调用
BindingResult.addError