[英]Custom generic request validator in Spring boot
我是Spring Boot的新手,我对请求字段验证有疑问。 我弄清楚了如何在字段级别使用注释来指定自定义错误消息:
public class EmployeeRequest {
@NotEmpty( message = "field name cannot be empty" )
@NonNull
private String name;
@NotEmpty( message = "field address cannot be empty" )
@NonNull
private String address;
}
但是对于使用这些注释,我必须为每个请求类中的每个字段指定错误消息。 同样由于某种原因,我得到的响应不是很简洁:
"org.springframework.validation.BeanPropertyBindingResult: 1 errors\\nField error in object 'employeeRequest' on field 'name': rejected value [null]; codes [NotEmpty.employeeRequest.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [employeeRequest.name,name]; arguments []; default message [name]]; default message [provide a name]"
假设所有字段都必须为NotEmpty
和NonNull
是否有更优雅,更通用的方式针对每个请求进行此类字段验证?
public class EmployeeController {
@PostMapping("/test")
@ResponseBody
public EmployeeResponse testMethod(@RequestBody EmployeeRequest request) {
genericFieldsValidatorForAllRequests(request);
doSomeStuffIfRequestIsValid(request);
}
有人可以提供一些想法如何实现请求验证器吗?
好像您问了两个问题,希望我可以尝试回答两个问题。
默认情况下,Spring Boot会捕获Web请求处理程序中引发的所有未捕获异常(例如@RequestMapping
@GetMapping
, @GetMapping
等),并将其转换为以下结构的JSON响应:
{
"timestamp": 1500597044204,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "JSON parse error: Unrecognized token .....",
"path": "/birds"
}
使错误响应JSON看起来与众不同的一种方法是制作异常处理程序。 基本上,您可以在使用Spring Boot的默认错误处理程序之前捕获所需的错误。 为此,您可以将其中之一放在与控制器相同的包装中,或者在比控制器更高的杠杆包装中:
@ControllerAdvice
public class GlobalErrorHandler {
@ExceptionHandler(ExceptionICareAbout.class)
public MyErrorResponseObject handleExceptionICareAbout(ExceptionICareAbout e) {
return new MyErrorResponseObject(<ADD CODE HERE>)
}
}
在您的情况下,您可以为MethodArgumentNotValidException
创建一个异常处理程序,并将其转换为您喜欢的错误响应。 (我相信这是在JSR303批注验证失败时引发的异常,但请仔细检查我)
您还可以将错误响应对象包装在Spring提供的用来对响应中的其他内容进行自定义的ResponseEntity<>
对象中,或者仅使用@ResponseStatus
注释异常处理程序方法以@ResponseStatus
返回的http状态代码进行自定义。
另外,如果您想捕获每个异常并阻止它们进入Spring Boot的默认异常处理程序,只需为Exception
类本身创建一个异常处理程序,例如@ExceptionHandler(Exception.class)
。
使用JSR303注解像你这样( @NotNull
, @Size
,等...),每场中的每个对象,你与组合在乎@Valid
注释是我所知道的最好的方式。 我会花时间考虑重用代码和错误消息的方法,但这就是我想到的所有事情。 也许我们可以在评论中得到一些好的答案。
Spring确实提供了您可以替代JSR303注释的这些验证器 ,但是我对它们没有太多的经验。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.