簡體   English   中英

澤西島無法捕獲任何傑克遜異常

[英]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))。

要覆蓋此行為,只需禁用映射器:

  1. 使用XML: <init-param> <param-name>jersey.config.server.disableAutoDiscovery</param-name> <param-value>true</param-value> </init-param>

  2. 使用代碼: 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.

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