11

私の REST API では、jersey と ExceptionMapper を使用してグローバルな例外をキャッチしています。アプリがスローするすべての例外でうまく機能しますが、ジャクソンによってスローされた例外をキャッチできません。

たとえば、私のエンドポイントの 1 つは、列挙型を含むオブジェクトを受け入れます。リクエストの 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 を拡張し、同様に呼び出す必要があるため、まだわかりません

4

3 に答える 3

10

同じ問題がありました。
問題は、マッパーの前に 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>

でも、やり過ぎだと思います。

于 2016-01-19T13:23:07.833 に答える
2

バージョン 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--

于 2021-10-28T16:22:29.990 に答える