问题描述
@ControllerAdvice
public class ValidationExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
public void constraintViolationException(HttpServletResponse response,ConstraintViolationException e) throws IOException {
Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
StringBuilder strBuilder = new StringBuilder();
for (ConstraintViolation<?> violation : violations ) {
strBuilder.append(violation.getMessage() + '\n');
}
ResponseEntity.status(BAD_REQUEST);
response.sendError(HttpStatus.BAD_REQUEST.value());
}
@ExceptionHandler(ValidationException.class)
public void dateViolationException(HttpServletResponse response,ValidationException e) throws IOException {
if(e.getMessage().equalsIgnoreCase("Resource Not Found")){
ResponseEntity.status(NOT_FOUND);
response.sendError(NOT_FOUND.value(),e.getMessage());
}
else{
ResponseEntity.status(BAD_REQUEST);
response.sendError(HttpStatus.BAD_REQUEST.value(),e.getMessage());
}
}
}
我正在以以下格式格式化Spring Boot中错误请求的错误格式:
{
"timestamp": "2020-08-13T09:44:29.000+0000","status": 400,"error": "Bad Request","message": "User Not Found in the system","path": "/claims/search/"
}
但是Source系统需要使用如下数组格式的Error格式:
[
{
"timestamp": "2020-08-13T09:44:29.000+0000","path": "/claims/search/"
}
]
解决方法
我没有单行解决方案,但是建立自己的自定义响应绝对是一种解决方案。
@Value(staticName = "of")
class ErrorResponseDto(
Integer status;
String error;
String message;
String path;
)
还提供了一个优点,您可以释放响应中实际需要的内容:
@ExceptionHandler(ValidationException.class)
public ResponseEntity<List<ErrorResponseEntity>> process(ValidationException ex,WebRequest request) {
return new ResponseEntity<>(Arrays.asList(generateErrorResponse(ex,request)),HttpStatus.BAD_REQUEST)
}
private ErrorResponseDto generateErrorResponseDto(ValidationException ex,WebRequest request) {
ErrorCode errorCode = ex.getErrorCode();
String message = ex.getMessage();
if (StringUtils.isBlank(message))
message = errorCode.name();
return new ErrorResponseDto(
ex.getStatus(),ex.getErrorCode(),message,request.getContextPath()
);
}
例如,您可以使用唯一的traceId字段或有关验证错误的更多详细信息来扩展它。
在这种情况下,我没有附加时间戳,但是最终的响应将是您需要的错误列表。