春季启动验证不起作用
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)
【讨论】:
以上是关于春季启动验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章