优化Response异常返回数据(使用jsr303参数校验)

前言

我们常见异常返回如下

{"timestamp":"2020-03-11T07:33:39.442+0000","status":400,"error":"Bad Request","message":"xxxxxxxx","path":"/validParams"}

在尤其在我们是用@Valid和@Validated注解的时候,message信息是不友好的,能不能显示我们希望的异常数据呢?可以的。所有的异常数据最后的处理都是DefaultErrorAttributes类中,重写此类,将异常信息改变成我们希望的即可。

解决

@Slf4j
@RestController
@Validated
public class Valid2Controller {
    @PostMapping("validUser")
    public String validUser(@RequestBody @Valid User user){
        return "success";
    }
   
    @PostMapping("validParams")
    public String validParams(@RequestParam("list") @NotEmpty(message = "集合不能为空") List<String> list,
                              @RequestParam("name") @NotBlank(message = "名称不能为空") String name) { return "success"; }
 
    @PostMapping("validUserNotFound")
    public String validUserNotFound(@RequestBody User user){
        throw new UserNotFoundException();
    }
    
    @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR,reason = "用户不存在")
    static class UserNotFoundException extends RuntimeException{
    }
}

@Component
public class ValidDefaultErrorAttributes extends DefaultErrorAttributes {
    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest,
                                                  boolean includeStackTrace) {
        Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);
        if(errorAttributes.isEmpty()) return errorAttributes;
        Throwable error = getError(webRequest);
        if (error instanceof MethodArgumentNotValidException) {
            BindingResult bindingResult = ((MethodArgumentNotValidException) error).getBindingResult();
            Map<String, String> errors1 = new HashMap<>();
            bindingResult.getAllErrors().forEach((ee) -> {
                String fieldName = ((FieldError) ee).getField();
                String errorMessage = ee.getDefaultMessage();
                errors1.put(fieldName, errorMessage);
            });
            if (errors1.isEmpty())return null;
            String msg = errors1.values().stream().collect(Collectors.joining(","));
            errorAttributes.put("message",msg);
        }else if(error instanceof ConstraintViolationException){
            Set<ConstraintViolation<?>> errors2 = ((ConstraintViolationException) error).getConstraintViolations();
            if (errors2.isEmpty())return null;
            String msg = errors2.stream().map(ee -> ee.getMessageTemplate()).collect(Collectors.joining(","));
            errorAttributes.put("message",msg);
            errorAttributes.put("status",400);
            errorAttributes.put("error","Bad Request");
        }

        return errorAttributes;
    }
}

截取的异常数据日志

2020-03-11 15:33:39.406 ERROR 19164 --- [           main] c.d.d.v.DurianValidationApplicationTests : error={"timestamp":"2020-03-11T07:33:35.413+0000","status":400,"error":"Bad Request","errors":[{"codes":["NotBlank.user.name","NotBlank.name","NotBlank.java.lang.String","NotBlank"],"arguments":[{"codes":["user.name","name"],"arguments":null,"defaultMessage":"name","code":"name"}],"defaultMessage":"名称不能为空","objectName":"user","field":"name","rejectedValue":"","bindingFailure":false,"code":"NotBlank"}],"message":"名称不能为空","path":"/validUser"}
null
2020-03-11 15:33:39.448 ERROR 19164 --- [           main] c.d.d.v.DurianValidationApplicationTests : error={"timestamp":"2020-03-11T07:33:39.442+0000","status":400,"error":"Bad Request","message":"名称不能为空,集合不能为空","path":"/validParams"}
null
2020-03-11 15:33:39.469 ERROR 19164 --- [           main] c.d.d.v.DurianValidationApplicationTests : error={"timestamp":"2020-03-11T07:33:39.468+0000","status":500,"error":"Internal Server Error","message":"用户不存在","path":"/validUserNotFound"}
发布了43 篇原创文章 · 获赞 14 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/zyt807/article/details/104798005