Java Spring引导执行器管理端点异常处理

Java Spring引导执行器管理端点异常处理,java,spring,spring-mvc,spring-boot,spring-boot-actuator,Java,Spring,Spring Mvc,Spring Boot,Spring Boot Actuator,问题:如何在管理上下文中处理MVC端点中抛出的异常 公共类MyMvcEndpoints扩展了EndpointMvcAdapter{ @应答器 @RequestMapping(method=GET,value=“/foo”,products=APPLICATION\u JSON\u value) 公共富富(){ 抛出新的footfound(“footfound!”); } } @ResponseStatus(值=HttpStatus.NOT_FOUND) 公共类FootFound扩展运行时异常{

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

公共类MyMvcEndpoints扩展了EndpointMvcAdapter{
@应答器
@RequestMapping(method=GET,value=“/foo”,products=APPLICATION\u JSON\u value)
公共富富(){
抛出新的footfound(“footfound!”);
}
}
@ResponseStatus(值=HttpStatus.NOT_FOUND)
公共类FootFound扩展运行时异常{
公共NotFoundException(字符串消息){
超级(信息);
}
}
使用当前配置,我接收的是
500
,而不是
404
。我尝试了常规的异常处理方法,如ControllerAdvice、ExceptionHandler方法等,但没有成功。

我还在
EndpointWebMvcChildContextConfiguration
中找到了负责异常处理的
CompositeHandlerExceptionResolver
。我试图定义自己的
HandlerExceptionResolver
bean,但它在管理上下文中找不到我的解析器。

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

@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;
    }
}

您的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";
    }
}

希望能有所帮助。

这看起来应该可以正常工作。Spring Boot自己的一些端点在异常情况下使用
@ResponseStatus
。你正在做的事情肯定还有一些你没有展示的东西。有趣的是,在发布问题之前,我已经测试了你发送的确切代码,看看它是如何工作的:它还返回
500
@Rad。你能找到解决方案吗?我有完全相同的问题。使用弹簧防尘套1.5.6否。我必须使用request/response对象直接处理它:(感谢您的回答,但正如问题中所述,它不起作用,这意味着控制器建议不会处理MVC端点引发的异常。默认情况下,ControllerAdvice将应用于使用控制器注释的所有类(扩展到使用RestController的类)@Rad您是否找到了解决方案?最终,我遇到了完全相同的问题。我必须使用请求/响应对象直接处理它:(感谢您的回答,但正如问题中所述,它不起作用,这意味着控制器建议不会处理MVC端点引发的异常。这很有趣。我已经测试了与您相同的代码,它工作正常。:)你能把这个项目上传到GitHub上,这样我就可以和我的项目进行比较了。谢谢。但这只是一个普通的spring web应用程序。这不是我想做的。我的控制器不是一个普通的控制器,它是在管理环境中。我在问题中解释过。你能分享你的GitHub上一期吗?!作为我之前的回答,不管你的控制器是什么是的,只是为了确保@ControllerAdvice生效,这将有助于包装异常。