【问题标题】:Spring Boot Actuator Management Endpoint Exception HandlingSpring Boot Actuator 管理端点异常处理
【发布时间】:2018-01-08 04:27:16
【问题描述】:

问题:如何在管理上下文中处理 MVC 端点中抛出的异常?

public class MyMvcEndpoints extends EndpointMvcAdapter {
    @ResponseBody
    @RequestMapping(method = GET, value = "/foo", produces = APPLICATION_JSON_VALUE)
    public Foo foo() {
        throw new FooNotFound("Foo Not Found!");
    }
}

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class FooNotFound extends RuntimeException {
    public NotFoundException(String message){
        super(message);
    }
}

使用当前配置,我收到500 而不是404。我尝试了通常的异常处理方法,如 ControllerAdvice、ExceptionHandler 方法等。没有成功。
我还在EndpointWebMvcChildContextConfiguration 中找到了CompositeHandlerExceptionResolver,它负责异常处理。我尝试定义自己的 HandlerExceptionResolver bean,但它在管理上下文中找不到我的解析器。

【问题讨论】:

  • 这看起来应该按原样工作。 Spring Boot 自己的一些端点在异常上使用@ResponseStatusHere's one example。你所做的事情肯定还有一些你没有展示出来的东西。
  • 有趣的是,在发布问题之前,我已经测试了您发送的确切代码,看看它是如何工作的:它还返回 500
  • @Rad 你能找到任何解决方案吗?我有完全相同的问题。使用 Spring Boot 1.5.6
  • 没有。我必须直接使用请求/响应对象来处理它:(

标签: java spring spring-mvc spring-boot spring-boot-actuator


【解决方案1】:

您可以使用控制器建议。 Spring 的@ControllerAdvice 注释是@Component 的一种特殊形式,用于处理控制器的横切关注点。最常见的用例是提供异常处理程序,但它也可以做一些其他巧妙的事情。

@ControllerAdvice
public class ExceptionControllerAdvice {

    @ExceptionHandler(Exception.class)
    public ModelAndView exception(Exception e) {
        ModelAndView mav = new ModelAndView("exception");
        mav.addObject("name", e.getClass().getSimpleName());
        mav.addObject("message", e.getMessage());

        return mav;
    }
}

【讨论】:

  • 感谢您的回答,但正如问题中所述,它不起作用,这意味着控制器建议不处理 MVC 端点抛出的异常。
  • 默认情况下,ControllerAdvice 将应用于所有使用 Controller 注解的类(扩展到使用 RestController 的类)
  • @Rad 你最终找到解决方案了吗,我遇到了完全相同的问题
  • 没有。我必须直接使用请求/响应对象来处理它:(
【解决方案2】:

您的 Spring 似乎无法检测到您的异常。因此,需要使用@ControllerAdvice 创建一个 GlobalException 类,然后将您的异常放入其中。看起来像:

public class FooNotFound extends RuntimeException {
    public NotFoundException(String message){
        super(message);
    }
}

@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(FooNotFound.class)
    @ResponseStatus(value=HttpStatus. NOT_FOUND, reason="Not found")
    public String handleFooNotFound(HttpServletRequest request, Exception ex){
        //'SOME CODE HERE'
        return "user_notfound";
    }
}

希望对您有所帮助。

【讨论】:

  • 感谢您的回答,但正如问题中所述,它不起作用,这意味着控制器建议不处理 MVC 端点抛出的异常。
  • 这很有趣。我已经测试了与您相同的代码,并且运行良好。 :)
  • 能否请您将项目上传到 GitHub,以便我可以与我的项目进行比较。谢谢。
  • 但这只是一个普通的spring web app。这不是我想要做的。我的控制器不是一个普通的控制器,它在管理环境中。我在问题中解释了。
  • 你能分享你当前问题的github吗?!作为我之前的回答,无论您的控制器是什么,只是为了确保 @ControllerAdvice 生效,这将有助于包装异常。
猜你喜欢
  • 2020-06-01
  • 2023-03-28
  • 2018-03-26
  • 2015-02-23
  • 2016-09-29
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多