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

标签 java hibernate spring-mvc

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

我已经对实体应用了一些验证并将代码添加到我的 Controller 中。当向 Controller 提交数据格式不正确的表单时,会显示错误页面 (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;

Controller 代码:

    @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"/>

这里的验证工作正常,我只是想将用户重定向回表单。任何人都可以看到我缺少的东西或为我指出正确的方向吗?

干杯, 丹尼

最佳答案

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

@want2learn 是对的 - 在确保数据有效之前,您不应该尝试保存数据。否则, validator 将抛出异常。只需将您的保存逻辑向下移动即可:

@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";
}

关于java - Spring MVC/hibernate 表单验证,不返回表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52763552/

相关文章:

java - Java中的装饰器

java - 如何 hibernate 批量插入实时数据?使用还是不使用@Transactional?

java - Spring MVC 绑定(bind)时 Spring 需要属性

hibernate - 了解Jasper Reports和Hibernate及其参数

spring - Spring MVC 如何处理 Controller 中引发的未捕获异常?

java - 具有 Spring Security 的 Spring MVC Controller 继承

java - 如何在 Kafka Admin API 中添加每个主题配置?

java - Jackson JSON 和 Hibernate JPA 问题的无限递归(又一个)

java - 为什么我的 String[] 出现错误 "no suitable constructor found"?

java - @Id 在插入实体 bean 时不会自动设置