繁体   English   中英

Spring Boot执行器管理端点异常处理

[英]Spring Boot Actuator Management Endpoint Exception Handling

问题:如何处理在管理上下文中在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的@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;
    }
}

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

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM