2016-08-10 6 views
-1

モデルを検証するために、javaxバリデーションを使用してWildflyアプリケーションを構築しました。 今、ValidationExceptionをキャッチする例外マッパーを記述しようとしています。オブジェクトは2つの互いに素なクラスのインスタンスです

@Provider 
public class MyValidationMapper implements ExceptionMapper<ValidationException> { 

    @Override 
    public Response toResponse(ValidationException exception) { 

     if (exception instanceof ResteasyViolationException) { 
      // do something specific 
     } 

     if (exception instanceof ConstraintViolationException) { 
      // do something specific 
     } 

     // do something generic 
    } 
} 

あなたがValidationExceptionの直接のサブクラスであり、どちらも、私はResteasyViolationExceptionConstraintViolationExceptionのための特別な処理をしたい見ることができるように。

問題はexceptionのインスタンスであり、どちらもです。

System.out.println(exception instanceof ResteasyViolationException); 
System.out.println(exception instanceof ConstraintViolationException); 

各回にtrueが得られる。 したがって、マッパーの動作は例外のタイプをチェックする順序に依存します。

どうすれば可能ですか?どうやら私の理解instanceofのいくつかのギャップがあります。またはResteasyについて特別なことがありますか?

+1

明らかに、型は互いに素ではありません。より具体的なものを確認してください(おそらく 'else if'を使用してください)。 – chrylis

+0

ブロックにreturn文がある場合はどちらも 'else if'は違いがありません。 @ Kayamanのヒントは役に立ちましたが、私は思ったよりも別のライブラリをサーバー上で使っているかもしれません。 – elactic

答えて

4

javadocによると、org.jboss.resteasy.api.validation.ResteasyViolationExceptionjavax.validation.ConstraintViolationExceptionに拡張されています。したがって、後者を扱う際は常に前者も扱います。

instanceofは使用しないでください。実際のタイプはgetClass()です。しかし、どんなクラスローダーにも関わらず、奇妙なことに注意してください。

+0

この場合、単純な 'if'の代わりに' else if'を追加すると本当に助けになるでしょう。 – SomeJavaGuy

+0

注文が正しい限り、もちろん正しいです。 – Kayaman

+0

私は 'resteasy-validator-provider-11'を使用しています。 [their docs](https://docs.jboss.org/resteasy/docs/3.0.18.Final/javadocs/index.html)によると、それは 'ValidationException'の直接のサブクラスです。私は実際にどのライブラリが使用されているか調べる必要があります。ポインタありがとう! – elactic

1

根本的な問題は、あなたの観測から間違った結論を出すことです。

あなたの所見によれば、これらの2つの例外は「分離」できません。 したがって、最も意味のある応答は、自分自身のの仮定にそれらの2つが互いに素であることに疑問を呈することです。例えば、javadocsを調べることによって。 Kayamannがあなたの答えであなたに言ったことをあなたに教えてくれたでしょう:それらの2つのクラスは、お互いに関係しています。

意味:このコンセプトに矛盾しているようなものにぶつかったからといって、20年以上にわたって単一継承を行っている言語を突然「壊す」とは思わないでください。

他の言葉で言えば、常に現実があなたの期待と矛盾しているときには、まず自分自身にまず質問してください。

+0

それで私の質問は "どうやってできますか?"私は、Javaが多重継承を導入したことを示唆していませんでしたが、私が逃しているものを尋ねました。答えは、間違ったlibのドキュメントをチェックしたことです。 – elactic

関連する問題