![](/img/trans.png)
[英]Why CORSFilter conflicts with ExceptionMapper<Throwable>?
[英]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.