将Spring Boot错误响应作为JSON列表而不是JSON对象返回

问题描述

@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字段或有关验证错误的更多详细信息来扩展它。

在这种情况下,我没有附加时间戳,但是最终的响应将是您需要的错误列表。