使用https://www.leveluplunch.com/java/tutorials/017-validate-spring-rest-webservice-request/教程,我想使用java验证表单而不重新加载页面。我在REST API中执行此操作。 我的控制器
@PutMapping(value = "/changeEmail", consumes = MediaType.APPLICATION_JSON_VALUE)
public HttpEntity<ChangeEmailDTO> showChangeEMail(
@RequestBody @Valid ChangeEmailDTO changeEmailDTO,
BindingResult result
) {
System.out.println("Email: " + changeEmailDTO.getEmail());
if(result.hasErrors()) {
System.out.println("Error: " + changeEmailDTO.getEmail());
return ResponseEntity.badRequest().body(changeEmailDTO);
}
System.out.println("Success: " + changeEmailDTO.getEmail());
return ResponseEntity.ok(changeEmailDTO);
}
接受电子邮件地址,在注释中验证
@NotEmpty
@Getter @Setter private String email;
根据上面的指南,它应该以json形式返回错误代码。它收到的唯一影响是https://zapodaj.net/81a6db4635168.png.html。 所以它返回对象本身,而不像教程
{"timestamp":1417379464584,"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.MethodArgumentNotValidException","message":"Validation failed for argument at index 0 in method: public org.springframework.http.ResponseEntity<demo.AgencyResource> demo.AgencyController.saveAgency(demo.AgencyResource), with 2 error(s): [Field error in object 'agencyResource' on field 'name': rejected value [null]; codes [NotNull.agencyResource.name,NotNull.name,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [agencyResource.name,name]; arguments []; default message [name]]; default message [may not be null]] [Field error in object 'agencyResource' on field 'id': rejected value [50]; codes [Max.agencyResource.id,Max.id,Max.java.lang.Integer,Max]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [agencyResource.id,id]; arguments []; default message [id],20]; default message [must be less than or equal to 20]] ","path":"/agencies"}
如何返回此类数据?
答案 0 :(得分:1)
从BindingResult result
方法签名和相应的showChangeEMail
中删除if
参数,您将获得异常,就像您在上面提到的教程中一样
然而,它可能看起来像一个bug或魔法它不是。 Spring-mvc能够检查此参数是否存在,如果是这样,假设您自己处理验证错误,则不会抛出任何异常。否则 - 将抛出异常。
有关信息,请查看导致此行为的RequestResponseBodyMethodProcessor
的{{3}}。
答案 1 :(得分:1)
使用BindingResult.hasErrors()在ValidationException的情况下控制响应。在这种情况下,您将返回带有错误请求http状态代码的DTO,如下所示。
return ResponseEntity.badRequest().body(changeEmailDTO);
上面提到的教程有spring提供的默认异常处理程序,它将Exception转换为该消息。
只需从方法签名中删除BindingResult,然后默认情况下将捕获任何类型的验证异常Exceptionhandler。然后你会得到上面提到的回应。