繁体   English   中英

Spring Boot中的自定义通用请求验证器

[英]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]"

假设所有字段都必须为NotEmptyNonNull是否有更优雅,更通用的方式针对每个请求进行此类字段验证?

public class EmployeeController {

    @PostMapping("/test")
    @ResponseBody
    public EmployeeResponse testMethod(@RequestBody EmployeeRequest request) {
        genericFieldsValidatorForAllRequests(request);
        doSomeStuffIfRequestIsValid(request);
}

有人可以提供一些想法如何实现请求验证器吗?

好像您问了两个问题,希望我可以尝试回答两个问题。

为什么JSON响应看起来“不是很整洁”?

默认情况下,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM