我有 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>
您需要使用
@Valid
,有些还需要使用 @ModelAttribute
作为 createNewBusiness()
的参数 - 取决于您的参数和内容。
您还需要将
th:field="*{adress}"
添加到您的输入字段,因为它是框架中该输入字段的 ID。
所以在你的情况下,方法头将如下所示:
public String createNewBusiness(@ModelAttribute Business business,
@Valid Model model, BindingResult result) {
// ...
}
如果您想抛出自定义验证错误(例如,如果您通过模型中注释验证器以外的其他方式验证字段),您可以通过
BindingResult#rejectValue()
方法来实现。
例如:
if (business.getEmail() == null || business.getEmail().length() == 0) {
result.rejectValue("email", "email.missing", "Must enter email");
}
显然电子邮件字段只是一个示例,因为您需要 thymeleaf 资源上的电子邮件字段以及错误字段。
我是 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>
我希望这会有所帮助。