当前位置: 首页 > 知识库问答 >
问题:

Spring-boot Rest:使用ControllerAdvice但保留默认处理程序

杜俊风
2023-03-14

我的基本需求是捕获用户定义的异常并返回通用响应。为此,我将@ControllerAdvice与@ExceptionHandler一起使用。参见下面的示例

@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler  {

    @ExceptionHandler(PersonNotFoundException.class)
    public void handleBadPostalCode(HttpServletResponse response) throws IOException {
        response.sendError(HttpStatus.BAD_REQUEST.value(), "Invalid person Id");
    }

    @ExceptionHandler(Exception.class)
    public void handleDefault(Exception e, HttpServletResponse response) throws IOException {
        e.printStackTrace();
        response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Unknown error happened");
    }
}

PersonNotFoundException按预期处理。但是其他异常默认处理程序已经消失,并且只返回没有正文的Http代码。显然这是扩展ResponseEntityExceptionHandler时的预期行为。我可以重写其他默认异常,但这并不理想。使用泛型Exception.Class处理程序将迫使我为所有这些代码返回一个HTTP代码。

因此,我正在寻找一种在ControllerAdvice或类似程序中全局处理我自己的异常的方法,而不必覆盖默认的异常处理程序

谢谢

共有1个答案

桂德义
2023-03-14

处理它的最快和最干净的方法就是在异常类上使用@responsestatus:

 @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order")  // 404
 public class OrderNotFoundException extends RuntimeException {
     // ...
 }

另外,扩展responseentityExceptionHandler是否有必要?不是的。您只能使用@controlleradvice(或@restcontrolleradvice)和@exceptionhandler来处理它

此外,您可以直接在方法中返回响应,而不需要注入HttpServletResponse和调用send()方法。看看这本指南吧。

 类似资料:
  • 主要内容:Spring Boot 默认异常处理机制,Spring Boot 异常处理自动配置原理在日常的 Web 开发中,会经常遇到大大小小的异常,此时往往需要一个统一的异常处理机制,来保证客户端能接收较为友好的提示。Spring Boot 同样提供了一套默认的异常处理机制,本节将对它进行详细的介绍。 Spring Boot 默认异常处理机制 Spring Boot 提供了一套默认的异常处理机制,一旦程序中出现了异常,Spring Boot 会自动识别客户端的类型(浏览器客户端或机器客户端)

  • 我尝试用的一个实例替换错误处理程序,但没有成功。 我尝试创建自己的CustomErrorHandler,但这也不合适,因为在重新路由到自定义错误控制器时,原始异常已不再存在于该异常中。为了向客户端返回适当的响应,需要这些信息。 吾如何曰: 使SpringBoot不将异常转发到异常控制器。 还原@ControllerAdvice异常处理程序,这样我就可以返回适当的响应正文和状态代码。

  • 问题内容: 在REST控制器中同时使用 @ControllerAdvice 和 @Valid 批注时,遇到了麻烦。 我有一个声明如下的rest控制器: 还有一个ErrorHandler类: 问题是,如果我在 RestExample.add* 方法中添加 “引发新的RuntimeException” ,则该异常由 RestErrorHandler 类正确处理。 *** 但是,当向控制器卷曲无效请求时

  • 我无法覆盖REST API中默认的Spring Boot错误响应。我有以下代码 然后在我的REST api中抛出这个BusinessValidationException。这个处理程序被调用(我可以在调试器中看到它),但是我仍然得到缺省的Spring BootREST错误消息。是否有一种方法可以重写并仅将default用作后退?带有Groovy的Spring Boot版本1.3.2。最诚挚的问候

  • Spring靴默认日志如下所示: 我写了一个对数Spring.xml,用于为我的应用程序设置一些记录器和附加器。但是,当“资源”目录中存在.xml时,Spring靴默认日志将消失。而且只有一个

  • 我有一个创建的Spring引导Restapi,我打算从另一个应用程序调用。我如何才能以这样一种方式保护它,我只能从那个应用程序调用我的api。 我在这方面很新,所以我真的不知道怎么做,因为我是SpringSecurity的新手。 谢谢你的建议。