Spring boot 验证不起作用

问题描述 投票:0回答:3

我有 Spring boot 应用程序,但无法向用户显示错误消息。没有该数据的对象不会保存在数据库中,这是可以的。但显示错误消息是问题所在。当我调试时,我得到错误 size = 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>
java validation spring-boot thymeleaf
3个回答
2
投票

您需要使用

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

您还需要将

th:field="*{adress}"
添加到您的输入字段,因为它是框架中该输入字段的 ID。


所以在你的情况下,方法头将如下所示:

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

1
投票

如果您想抛出自定义验证错误(例如,如果您通过模型中注释验证器以外的其他方式验证字段),您可以通过

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)


0
投票

我是 Spring Boot 的初学者,所以这是一个用于学习的小项目。我遇到了这个问题,所以我做了什么,我将所有错误都有一个列表作为错误列表传递给 html,然后使用 Each 函数来获取每个元素的具体错误:

@PostMapping("/")
public String save(Model model, @Validated ProductEntity product, BindingResult result) {
    if (result.hasErrors()) {
        model.addAttribute("product", product);
        model.addAttribute("errorlist",result.getAllErrors());
        return "index";
    }

    productRepo.save(product);
    model.addAttribute("msg", "Added Product");
    model.addAttribute("product", new ProductEntity()); 
    return "index";
}

显示错误的 html 是:

<div th:each="error : ${errorlist}" th:if="${error.objectName == 'productEntity' && error.field == 'price'}" th:text="${error.defaultMessage}"></div>

我无法使用此找到无效数据的消息:

<p th:if="${#fields.hasErrors('price')}" th:errors="*{price}"></p>

我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.