为什么 org.springframework.web.SimpleErrorResponse 在错误响应正文中有 Java 实现细节?

问题描述 投票:0回答:1

我尝试创建一个全局异常处理程序来处理我所有的

ResourceNotFoundException
via

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.ErrorResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;

@ControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(ResourceNotFoundException.class)
  public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex,
      WebRequest request) {
    ErrorResponse errorResponse = ErrorResponse.create(ex, HttpStatus.NOT_FOUND, ex.getMessage());
    return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
  }

}

错误已按预期处理。然而,在我的响应 JSON 中,我现在有了具体的实现细节,我认为与 API 用户共享它们是不好的做法:

"detailMessageCode":"problemDetail.net.javaguides.springboot.exception.ResourceNotFoundException","detailMessageArguments":null,"titleMessageCode":"problemDetail.title.net.javaguides.springboot.exception.ResourceNotFoundException"

我发现ErrorResponse工厂方法使用DefaultErrorResponseBuilder,它将

typeMessageCode
detailMessageCode
设置为异常的类。

我喜欢标准化错误的想法(

RFC 9457
),对我来说,默认实现将非常好,如果不共享实现细节的话。有人可以向我解释一下在错误响应正文中包含 java 实现详细信息的好理由吗?如果没有,我想我必须自己实现一个自定义的
ErrorResponse
而不设置这些代码。

java spring spring-boot spring-mvc
1个回答
0
投票

实现自定义错误消息类,而不是检查特定类型的异常,而是检查通用级别的异常,并在方法中实现逻辑。

@ControllerAdvice
public class ExceptionMapper extends ResponseEntityExceptionHandler {
    @ExceptionHandler(Throwable.class)
    @ResponseBody
    public ResponseEntity<Error> handleException(HttpServletRequest req, Exception exception) {       
        String message = "Internal Server Error";
        String code = "";       
        if ( exception instanceof ResourceNotFoundException) {
            ResourceNotFoundException exc = (ResourceNotFoundException) exception;
            status = HttpStatus.NOTFOUND;
            message = exc.getMessage();
        }

        Error error = new Error();
        error.setCode(code);
        error.setTraceId(tracID);
        error.setMessage(message);
        error.setReason(message);
        // set more fields in case needed
        return new ResponseEntity<Error>(error, status);
    }   
}

Public class Error{
  //setter getter 
}

ResponseEntityExceptionHandler Spring提供的类,用于处理异常并映射到适当的错误响应。

© www.soinside.com 2019 - 2024. All rights reserved.