2017-08-01 70 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

相關問題