簡體   English   中英

異常映射器 <Throwable> 未在ForbiddenException上調用

[英]ExceptionMapper<Throwable> not called on ForbiddenException

我在Spring Boot中使用Jersey。 我有一個通過ResourceConfig.register(MyExceptionMapper.class)注冊的ExceptionMapper<Throwable>並用@Provider注釋。

如果我的代碼拋出RuntimeException MyExceptionMapper.toResponse()調用MyExceptionMapper.toResponse()

但是,如果我的應用程序拋出javax.ws.rs.ForbiddenException ,則即使它是ExceptionMapper<Throwable>也不會調用我的ExceptionMapper

我假設Jersey有一個默認的ExceptionMapper ,它正在處理WebApplicationException (我假設)。 我該如何自定義呢?

我真正想做的就是在任何Throwable情況下添加DEBUG日志記錄(其余代碼對於非WebApplicationException而言效果很好)。 有一個更好的方法嗎?

分為兩個部分:

首先,澤西島沒有達到我的ExceptionMapper的原因是,它僅在內部不支持映射的ExceptionMapper下才嘗試這樣做。 ServerRuntime.Responder類嘗試映射任何WebApplicationException 僅當由於某種原因該操作未成功時,才會將異常提供給ExceptionMapper (至少這是我所看到的行為)。

其次,有兩種添加日志記錄的方法:

  • 設置ServerRuntime.Responder的日志記錄級別。 對我來說,這太廣泛了,因為它將記錄所有響應,而不僅僅是異常。 這在這里描述: https : //stackoverflow.com/a/41484564/905762
  • 我采用的解決方案是添加一個ContainerResponseFilter並從ContainerRequest獲取異常。 這在這里有所描述: https//stackoverflow.com/a/19680862/905762

    公共類ExceptionsLoggingContainerResponseFilter實現ContainerResponseFilter {私有最終靜態Logger LOGGER = LoggerFactory.getLogger(ExceptionsLoggingContainerResponseFilter.class);

    @Override public void filter(ContainerRequestContext request,ContainerResponseContext response){Throwable throwable =((ContainerRequest)response).getMappedThrowable(); 如果(throwable!= null){LOGGER.info(buildErrorMessage(request),throwable); }}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM