【问题标题】: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...

标签: java validation spring-boot thymeleaf


【解决方案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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2017-04-28
      相关资源
      最近更新 更多