[英]Jersey unable to catch any Jackson Exception
對於我的 REST api,我使用 jersey 和 ExceptionMapper 來捕獲全局異常。 它適用於我的應用程序拋出的所有異常,但我無法捕獲 jackson 拋出的異常。
例如,我的端點之一接受包含枚舉的對象。 如果請求中的 Json 具有不在 enum jersey 中的值,則拋出此異常
Can not construct instance of my.package.MyEnum from String value 'HELLO': value not one of declared Enum instance names: [TEST, TEST2]
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@5922e236; line: 3, column: 1] (through reference chain: java.util.HashSet[0]->....)
即使我已經創建了這個映射器
@Provider
@Component
public class JacksonExceptionMapper implements ExceptionMapper<JsonMappingException> {
@Override
public Response toResponse(JsonMappingException e) {
....
}
}
代碼永遠不會到達這個映射器。
為了捕獲這些異常,我們需要做些什么嗎?
編輯注意:我只是嘗試不那么一般,而不是 JsonMappingException 我使用 InvalidFormatException 在這種情況下調用映射器。 但我仍然不明白,因為 InvalidFormatException 擴展了 JsonMappingException 並且也應該被調用
有同樣的問題。
問題是JsonMappingExceptionMapper在映射器之前啟動。
實際的異常是類com.fasterxml.jackson .databind.exc.InvalidFormatException ,映射器定義了com.fasterxml.jackson .jaxrs.base.JsonMappingException ,因此它更具體的異常。
你看,Jersey的異常處理程序看起來找到最准確的處理程序(參見org.glassfish.jersey.internal.ExceptionMapperFactory#find(java.lang.Class,T))。
要覆蓋此行為,只需禁用映射器:
使用XML: <init-param> <param-name>jersey.config.server.disableAutoDiscovery</param-name> <param-value>true</param-value> </init-param>
使用代碼: resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);
其中resourceConfig的類型為org.glassfish.jersey.server.ServerConfig。
您也可以編寫自己的特定映射器:
public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException>
但我認為這是一個過度殺戮。
嗨,它現在似乎退出了另一個答案,不需要禁用澤西島AUTO_DISCOVERY功能。
只需使用@Priority(1)注釋注釋您自己的異常映射器。 數字越小,優先級越高。 由於傑克遜自己的地圖制作者沒有任何優先權注釋,您的執行將被執行:
@Priority(1)
public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException>
從版本 2.29.1 [1] 開始,如果您正在注冊JacksonFeature
,您現在可以在不注冊異常映射器 [2] 的情況下這樣做:
register(JacksonFeature.withoutExceptionMappers());
[1] https://github.com/eclipse-ee4j/jersey/pull/4225 [2] https://eclipse-ee4j.github.io/jersey.github.io/apidocs/2.34/jersey/org/glassfish /jersey/jackson/JacksonFeature.html#withoutExceptionMappers--
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.