Java Spring MVC/hibernate表单验证,不返回表单

Java Spring MVC/hibernate表单验证,不返回表单,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,我目前正在使用Hibernate和SpringMVC进行一些HTML表单验证 我已经对Enity应用了一些验证&将代码添加到我的控制器中。向控制器提交表单时,数据格式不正确,将显示错误页面500。但是,我希望将表单返回给用户,并在错误字段附近显示错误消息 实体代码: @NotNull(message="Please enter a product") @Column(name="product_name") private String productName; @N

我目前正在使用Hibernate和SpringMVC进行一些HTML表单验证

我已经对Enity应用了一些验证&将代码添加到我的控制器中。向控制器提交表单时,数据格式不正确,将显示错误页面500。但是,我希望将表单返回给用户,并在错误字段附近显示错误消息

实体代码:

 @NotNull(message="Please enter a product")
    @Column(name="product_name")
    private String productName;

    @NotNull(message="Please enter a product code")
    @Pattern(regexp="([A-Z]{2,4})-([0-9]{5})|", message="Incorrect format")
    @Column(name="product_code")
    private String productCode;
控制器代码:

    @GetMapping("/showFormForAdd")
public String showFormForAdd(Model theModel) {

    // create model attribute to bind form data
    QaRaised theProduct = new QaRaised();

    theModel.addAttribute("product", theProduct);

    return "product-form";
}

@PostMapping("/saveProduct")
public String saveProduct(@Valid @ModelAttribute("product") QaRaised theProduct, BindingResult bindingResult) {

    qaRaisedService.saveProduct(theProduct);
    if (bindingResult.hasErrors()) {
        return "product-form";
    }

    return "redirect:/products/qaraised";
}
堆栈跟踪自错误:

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [com.sonya.spring.entity.QaRaised] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[ConstraintViolationImpl{interpolatedMessage='Incorrect format', propertyPath=productCode, rootBeanClass=class com.sonya.spring.entity.QaRaised, messageTemplate='Incorrect format'}
表格编号:

  <div class="form-group">
<label for="InputPC">Product Code:</label>
<form:input required="true" type="text"  title="Product Code" path="productCode" class="form-control" id="productCodeInput" placeholder="Enter Product Code" commandName="productCode"/>
<form:errors path="productCode"/>
这里的验证工作正常,我只想将用户重定向回表单。有没有人能看到我遗漏了什么或者给我指出了正确的方向

干杯,
Danny

这是一个老问题,但我实际上遇到了与您相同的编码问题,所以万一其他人遇到这个问题

@want2learn是正确的-在确保数据有效之前,不应尝试保存数据。否则,验证程序将抛出异常。只需向下移动您的保存逻辑:

@PostMapping("/saveProduct")
public String saveProduct(@Valid @ModelAttribute("product") QaRaised theProduct, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "product-form";
    }
    qaRaisedService.saveProduct(theProduct);
    return "redirect:/products/qaraised";
}

为什么在验证之前调用saveProduct?尝试返回重定向:产品表单;嗨,想学习吗。谢谢你的回复。我的印象是,如果提交的表单上存在任何验证错误,则保存将不会通过。我将尝试更改重定向,但相信同样的结果也会发生。检查绑定结果后,您必须移动保存代码。您好,想了解一下,很抱歉,您的评论让我有点困惑。我整天都在看一些辅助项目的指南,我是java/hibernate/sprint的新手,正在以同样的方式处理保存。我将研究如何将它们分离出来,看看我能想出什么。如果输入的数据格式正确,则会进行保存。如果存在验证错误,则只能通过检查bindingResult进行检测。若删除该检查,无论是否存在验证错误,代码都将通过。所以,您要做的第一件事是检查bindingResult是否有错误,如果没有,请继续。希望这有帮助。