前言
我们常见异常返回如下
{"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"}