私のプロジェクトの1つでは、すでにJerseyをバージョン2.14
から2.23
にアップグレードしました。しかし、私は1つの問題で何時間も苦労しています。私のプロジェクトではValidationException
のためにExceptionMapper
が定義されていますが、残念ながらJerseyには既にこの例外のための組み込みの例外マッパーがあります。Jersey 2.23の組み込み例外マッパーをオーバーライドする方法は?
私は(私はそれをチェックする)、以下に提示され、私自身マッパー正しく登録されています:
@Provider
public class ValidationExceptionMapper implements
ExceptionMapper<ValidationException> {
@Override
public Response toResponse(ValidationException exception) {
return Response.status(Status.BAD_REQUEST).build();
}
}
それが呼び出されませんさん。ジャージーはいつもorg.glassfish.jersey.server.validation.internal.ValidationExceptionMapper
を拾う。 カスタムマッパーにも@Priority
注釈を使用しようとしましたが、残念ながらJerseyでは考慮していません。
何が起こっているのですか?以前のJerseyバージョンでは正常に動作していたので、回帰バグのようです。
私はあきらめます。すべての手がかりは?
回避策として「ConstraintViolationException」(検証例外の実際のタイプ)を使用できます。これは 'ValidationException'よりも具体的であるため、優先されます。 _all_ meta-infプロバイダーを無効にしなくても(楽しい解決策ではなく)、その1つのマッパーを無効にする方法は決して分かりませんでした。私の回避策は、単にConstraintViolationExceptionのマッパーを使用することでした。 –
ありがとう、私は知っていますが、これでは問題はまったく解決されません。アプリケーションは 'ValidationException'に応答する必要があるためです。 –
'ConstraintViolationException'は' ValidationException'を拡張しています。 JerseyのBean検証でスローされる例外の型は、常にConstraintViolationExceptionです。スーパータイプのマッパーはサブタイプの例外を処理できるので、サブタイプのマッパーはありません –