Spring @ControllerAdvice vs ErrorController

wljmcqd8  于 2023-08-02  发布在  Spring
关注(0)|答案(2)|浏览(117)

bounty还有5天到期。回答此问题可获得+100声望奖励。Evmorov正在寻找规范答案:当前答案不是100%正确,也不是描述性的

在我的REST服务应用程序中,我计划创建一个@ControllerAdvice类来捕获控制器抛出的异常,并根据错误类型返回ResponseEntity对象。
但是我已经有一个@RestController类实现了ErrorController接口来捕获所有异常。
这两个人会以任何方式干涉吗?@ControllerAdvice存在时,ErrorController将在哪些情况下被调用?
编辑:ErrorController代码

@RestController
public class ControllerCustomError implements ErrorController{

    //error json object
    public class ErrorJson {

        public Integer status;
        public String error;
        public String message;
        public String timeStamp;
        public String trace;

        public ErrorJson(int status, Map<String, Object> errorAttributes) {
            this.status = status;
            this.error = (String) errorAttributes.get("error");
            this.message = (String) errorAttributes.get("message");
            this.timeStamp = errorAttributes.get("timestamp").toString();
            this.trace = (String) errorAttributes.get("trace");
        }

    }

    private static final String PATH = "/error";

    @Value("${hybus.error.stacktrace.include}")
    private boolean includeStackTrace = false;

    @Autowired
    private ErrorAttributes errorAttributes;

    @RequestMapping(value = PATH)
    ErrorJson error(HttpServletRequest request, HttpServletResponse response) {
        // Appropriate HTTP response code (e.g. 404 or 500) is automatically set by Spring. 
        // Here we just define response body.
        return new ErrorJson(response.getStatus(), getErrorAttributes(request, includeStackTrace));
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }

    private Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return errorAttributes.getErrorAttributes(requestAttributes, includeStackTrace);
    }
}

字符串

jmo0nnb3

jmo0nnb31#

ErrorController的实现用于提供自定义白标签错误页。
@ControllerAdvise标注的类用于为整个应用程序添加全局异常处理逻辑。因此,您的应用程序中有多个控制器。
如果在您的应用程序中找不到请求或页面的Map,则Spring将回退到“whitelabel error page”(白标签错误页面)。在本例中,它将是ErrorController的自定义实现

z9ju0rcb

z9ju0rcb2#

在Sping Boot 中,ErrorController@ControllerAdvice都用于处理和自定义错误响应,但它们的用途不同:

  • ErrorController提供了一种针对特定错误代码或情况自定义错误处理的方法,通常用于处理标准HTTP错误。
  • @ControllerAdvice用于跨应用程序的全局异常处理,允许您处理自定义异常并提供一致的响应。

如果在Sping Boot 应用程序中同时有ErrorController的实现和用@ControllerAdvice注解的类,那么@ControllerAdvice将首先被调用。Sping Boot 中异常处理的执行顺序如下:
1.如果控制器方法中发生异常,Spring会在同一控制器中寻找合适的@ExceptionHandler方法来处理该异常。如果找到,将执行控制器中的@ExceptionHandler
1.如果在控制器中没有找到匹配的@ExceptionHandler,Spring将在任何带有@ControllerAdvice注解的类中寻找合适的@ExceptionHandler方法。如果在@ControllerAdvice类中找到匹配的@ExceptionHandler,则将执行它。
1.如果在控制器或@ControllerAdvice类中找不到@ExceptionHandler,Spring将返回到默认的错误处理机制,这可能涉及调用ErrorController(如果实现了)来处理错误。

相关问题