有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring boot@ExceptionHandler未响应自定义响应

我有一个带有@RestControllerAdvice和@ExceptionHandler(APIException.class)方法的全局异常处理程序。 我已经设计了自己的响应类ValidationResponse。类,我正在将其添加到响应实体类中。 我想用ValidationResponse进行响应,但得到一些通用响应

全局异常处理程序

@RestControllerAdvice
public class RestResponseExceptionHandler {

    @ExceptionHandler(APIException.class)
    public ResponseEntity<ValidationResponse> handleException(APIException ex) {
        ValidationResponse validationResponse = new ValidationResponse(ex.getErrorCode(), ex.getErrorMessage());
        return new ResponseEntity<>(validationResponse, ex.getHttpStatus());
    }
}

自定义异常类

@Getter
@Setter
public class APIException extends RuntimeException {

    private int errorCode;

    private String errorMessage;

    private HttpStatus httpStatus;

    public APIException(int errorCode, String errorMessage, HttpStatus httpStatus) {
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
        this.httpStatus = httpStatus;
    }

    public APIException(int errorCode, String errorMessage, HttpStatus httpStatus, Exception e) {
        super(e);
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
        this.httpStatus = httpStatus;
    }

}

定制响应设计

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(Include.NON_NULL)
public class ValidationResponse {

    public int errorCode;

    public String errorMessage;
}

预期响应

{
    "errorCode": 1010,
    "errorMessage": "some custome validation message"
}

当前响应

{
  "error-message" : "Request processing failed; nested exception is com.package.exception.APIException",
  "error-code" : "GENERAL_ERROR",
  "trace-id" : null,
  "span-id" : null
}

共 (1) 个答案

  1. # 1 楼答案

    @ControllerAdvice
    public class RestResponseExceptionHandler extends ResponseEntityExceptionHandler {
    
        @ExceptionHandler(APIException.class)
        public ResponseEntity<ValidationResponse> handleException(APIException ex, WebRequest webRequest) {
    
        }
    }
    

    试试这个