2017-08-01 128 views
2

问题:如何处理管理环境中MVC端点引发的异常?Spring Boot Actuator Management端点异常处理

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方法等。没有成功。
我还发现CompositeHandlerExceptionResolverEndpointWebMvcChildContextConfiguration这是负责异常处理。我试图定义自己的HandlerExceptionResolver bean,但它在管理上下文中找不到我的解析器。

+0

这看起来应该按原样工作。一些Spring Boot自己的端点在异常时使用'@ ResponseStatus'。 [这是一个例子](https://github.com/spring-projects/spring-boot/blob/52536dc291da1b3417f465d73b72d60011b53fda/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/ EnvironmentMvcEndpoint.java#L122)。对于你没有展示的东西,一定还有更多的东西。 –

+0

有趣的是,在发布问题之前,我已经测试了您发送的确切代码以查看它的工作原理:它还返回了'500'。 – Rad

+0

@Rad你能找到任何解决方案吗?我有完全相同的问题。使用Spring引导1.5.6 –

回答

0

您可以使用控制器建议。 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; 
    } 
} 
+0

)处理它。谢谢你的回答,但正如问题所述,它不工作,这意味着控制器建议不处理MVC抛出的异常 – Rad

0

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

希望这个帮助。

+0

感谢您的回答,但正如问题中所述,它不起作用,这意味着控制器建议不处理MVC端点抛出的异常 – Rad

+0

这很有趣,我已经测试了与您的代码相同的代码,并且工作正常。 :) –

+0

您可以将项目上传到GitHub,以便我可以与我的项目进行比较。谢谢。 – Rad

相关问题