Response Optimization abnormal return data (using the parameters jsr303 check)

Foreword

The most common abnormal returns following

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

In particular, when we are with @Valid and @Validated annotation, message information is unfriendly, can not show abnormal data we want to do? Possible. The final process is DefaultErrorAttributes class for all of abnormal data, the rewriting such, the exception information we want to change to.

solve

@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;
    }
}

Abnormality data log taken

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"}
Published 43 original articles · won praise 14 · views 70000 +

Guess you like

Origin blog.csdn.net/zyt807/article/details/104798005