春季启动验证不起作用

Posted

技术标签:

【中文标题】春季启动验证不起作用【英文标题】:Spring boot validation doesn't work 【发布时间】:2018-09-04 16:15:03 【问题描述】:

我有 Spring Boot 应用程序,但无法向用户显示错误消息。没有该数据的对象不会保存在数据库中,这没关系。但显示错误消息是问题所在。当我调试时,我得到错误大小 = 0

这是我的模型:

 @Size(min = 1, message = "Address is invalid.")
 @NotNull
 @Column
 private String address;

控制器

  @RequestMapping(value = "/create", method = RequestMethod.POST, 
  consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
  public String createNewBusiness(@Valid @ModelAttribute("business") 
  Business business, BindingResult result, Model model) 
  model.addAttribute("userEmail", getUserEmail());
   logger.info("/business/create:" + business.toString());
  LocationResponse locationResponse = geoService.getCoords(business.getAddress());

if(locationResponse.getStatus().equals("OK")) 
    business.setLatitude(locationResponse.getResults().get(0).getGeometry().getLocation().getLat());
    business.setLongitude(locationResponse.getResults().get(0).getGeometry().getLocation().getLng());
    business.setUserId(getUserId());

    businessService.createNew(business);

    model.addAttribute("business", business);

else
    business.setAddress(null);
    model.addAttribute("business", business);



if(result.hasErrors())
    List<FieldError> errors = result.getFieldErrors();
    for (FieldError error : errors ) 
        System.out.println (error.getObjectName() + " - " + error.getDefaultMessage());
    
    return "newBusiness";


return "business";

还有百里香

<div class="input-field left m-0 w-100">
                        <i class="fa fa-map-marker prefix grey-text" aria-hidden="true"></i>
                        <input placeholder="Address" id="inputAddress" name="address" type="text" class="validate my-0" th:required="true">
                        <label th:errors="*address" th:if="$#fields.hasErrors('address')" >Invalid address </label>
                    </div>

【问题讨论】:

我的解决方案对您有用吗?请让我知道(稍后)。 我编辑了控制器,但仍然没有显示错误消息 您正在验证 buisness,但您希望 adress 有效并在 UI 中输入。这个字段是buisness-Entity 的一部分吗? 是的,字段地址是业务的一部分。 尝试使用 UI 上的字段 ID 来显示消息。所以你应该在.hasErrors() 上使用inputAddress 而不是adress。最后认为我期望的是您需要使用字段 ID... 【参考方案1】:

您需要使用 @Valid@ModelAttribute 作为 createNewBusiness() 的参数 - 取决于您的参数和内容。

您还需要将th:field="*adress" 添加到您的输入字段,因为它是框架中此输入字段的 ID。


所以在你的情况下,方法头看起来像这样:

public String createNewBusiness(@ModelAttribute Business business,
    @Valid Model model, BindingResult result) 
    // ...

【讨论】:

【参考方案2】:

如果您想抛出自定义验证错误(例如,如果您通过模型中的注解验证器以外的方式验证字段),您可以通过BindingResult#rejectValue() 方法来实现。 例如:

if (business.getEmail()  == null || business.getEmail().length() == 0) 
    result.rejectValue("email", "email.missing", "Must enter email");

显然电子邮件字段只是一个示例,因为您需要 thymeleaf 资源上的电子邮件字段以及错误字段。

有关此主题的更多信息,请访问 https://docs.spring.io/autorepo/docs/spring-framework/3.2.8.RELEASE/javadoc-api/org/springframework/validation/Errors.html#rejectValue(java.lang.String,%20java.lang.String,%20java.lang.Object[],%20java.lang.String)

【讨论】:

以上是关于春季启动验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

春季启动@Transactional 不起作用

春季启动 - MySQL 设置不起作用

春季启动图像上传到谷歌云存储桶不起作用

春季启动中的休眠统计信息不起作用?

春季安全+休息不起作用

春季启动从 1.2.0 升级到 2.1.3 后,Websocket 推送通知不起作用