Controller 层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@RestController public class TestController { /** * Valid 和 Validated 差不多都是可以使用,如果遇到嵌套验证,请使用@Valid * @param params * @return */ @PostMapping("/test03") public Result test03(@Valid @RequestBody RequestParams params){ System.out.println(params); return ResultGenerator.genResult(ResultCode.SUCCESS,"success"); } } |
Entity 层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@Data public class RequestParams implements Serializable { private static final long serialVersionUID = 7474587299312738641L; @NotNull(message = "string 不能为空") private String string; private Integer integer; @NotBlank(message = "用户名不能为空") private String username; @Min(value = 18, message = "年龄需要大于18") @Max(value = 25, message = "年龄需要小于25") @NotNull(message = "年龄不能为空") private Integer age; @Email @NotBlank(message = "email不能为空") private String email; } |
测试:
PostData:
1 2 3 4 5 6 7 8 |
{ "string":null, "integer":1100, "username":"usernameData", "age":191, "email":"emailddq.com" } |
返回值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
{ "timestamp": "2020-05-25T07:08:54.692+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "Email.requestParams.email", "Email.email", "Email.java.lang.String", "Email" ], "arguments": [ { "codes": [ "requestParams.email", "email" ], "arguments": null, "defaultMessage": "email", "code": "email" }, [], { "arguments": null, "defaultMessage": ".*", "codes": [ ".*" ] } ], "defaultMessage": "不是一个合法的电子邮件地址", "objectName": "requestParams", "field": "email", "rejectedValue": "emailddq.com", "bindingFailure": false, "code": "Email" }, { "codes": [ "NotNull.requestParams.string", "NotNull.string", "NotNull.java.lang.String", "NotNull" ], "arguments": [ { "codes": [ "requestParams.string", "string" ], "arguments": null, "defaultMessage": "string", "code": "string" } ], "defaultMessage": "string 不能为空", "objectName": "requestParams", "field": "string", "rejectedValue": null, "bindingFailure": false, "code": "NotNull" }, { "codes": [ "Max.requestParams.age", "Max.age", "Max.java.lang.Integer", "Max" ], "arguments": [ { "codes": [ "requestParams.age", "age" ], "arguments": null, "defaultMessage": "age", "code": "age" }, 25 ], "defaultMessage": "年龄需要小于25", "objectName": "requestParams", "field": "age", "rejectedValue": 191, "bindingFailure": false, "code": "Max" } ], "message": "Validation failed for object='requestParams'. Error count: 3", "path": "/test03" } |
从上面返回的信息可以确定 有三个字段是不合法字段,这是默认的返回效果;
如果我们想自定义返回效果呢?
那么我们就需要引入全局异常的概念
SpringBoot 全局异常
如果对SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot中有一个ControllerAdvice
的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler
注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@ControllerAdvice @ResponseBody public class GlobalExceptionHandler { /** * validation异常捕获处理 (可能是MethodArgumentNotValidException或 BindException) * * @param e MethodArgumentNotValidException 异常 * @return com.example.common.bean.JsonResult */ @ExceptionHandler(value = MethodArgumentNotValidException.class) public Result serviceHandle(MethodArgumentNotValidException e) { List<FieldError> allErrors = e.getBindingResult().getFieldErrors(); List<String> collect = allErrors.stream().map(i -> { return i.getField() + ": " + i.getDefaultMessage(); }).collect(Collectors.toList()); return ResultGenerator.genFailResult(collect.toString()); } } |
全局异常测试


