7

次のような Bean 検証を使用して、JAX-RS リソース クラス フィールドまたはメソッド パラメータを簡単に検証できます。

@Size(min = 18, max = 80, message = "Age must be between {min} and {max}.") String age;

エラー メッセージを JSP ページにバインドする最も簡単な方法は何ですか?

(たとえば、Jersey または Resteasy で Java EE 7 を使用しています)

4

1 に答える 1

18

編集1

このユースケースをカバーする新しいアノテーション@ErrorTemplateを Jersey 2.3 に導入しました。MVC を使用した JAX-RS および Bean 検証エラーの処理では、詳細について説明し、使用方法を示します。


Jersey を使用すると、次の手順を実行できます。

  1. 次の依存関係を追加しますjersey-bean-validationjersey-mvc-jsp
  2. ConstraintViolationExceptionのExceptionMapperを作成する
  3. プロバイダーを登録する

依存関係

Maven を使用している場合は、これらの依存関係をpom.xml

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-mvc-jsp</artifactId>
    <version>2.1</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-bean-validation</artifactId>
    <version>2.1</version>
</dependency>

それ以外の場合は、モジュールの依存関係のページを参照して、必要なライブラリ ( jersey-mvc-jspおよびjersey-bean-validation ) のリストを取得してください。

例外マッパー

Bean Validation ランタイムは、エンティティ (または JAX-RS リソース) の検証中に何か問題が発生すると ConstraintViolationException をスローします。Jersey 2.x は、(正確には) そのような例外を処理するための標準の ExceptionMapper を提供するValidationExceptionため、別の方法で処理したい場合は、独自の ExceptionMapper を作成する必要があります。

@Provider
@Priority(Priorities.USER)
public class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

    @Override
    public Response toResponse(final ConstraintViolationException exception) {
        return Response
                // Define your own status.
                .status(400)
                // Put an instance of Viewable in the response so that jersey-mvc-jsp can handle it.
                .entity(new Viewable("/error.jsp", exception))
                .build();
    }
}

上記の ExceptionMapper を使用すると、スローされたすべての ConstraintViolationExceptions を処理し、最終的な応答にHTTP 400応答ステータスが含まれます。レスポンスに渡されたエンティティ ( Viewable ) は、モジュールから MessageBodyWriter によって処理され、jersey-mvc基本的には処理された JSP ページが出力されます。Viewable クラスの最初のパラメーターは JSP ページへのパス (相対パスまたは絶対パスを使用できます) で、2 番目は JSP がレンダリングに使用するモデルです (モデルは${it}JSP の属性を介してアクセスできます)。このトピックの詳細については、Jersey ユーザー ガイドのMVCに関するセクションを参照してください。

プロバイダーの登録

最後に、プロバイダーをアプリケーションに登録する必要があります( Application クラスを拡張する JerseyのResourceConfigを使用した例を示します)。

new ResourceConfig()
    // Look for JAX-RS reosurces and providers.
    .package("my.package")
    // Register Jersey MVC JSP processor.
    .register(JspMvcFeature.class)
    // Register your custom ExceptionMapper.
    .register(ConstraintViolationExceptionMapper.class)
    // Register Bean Validation (this is optional as BV is automatically registered when jersey-bean-validation is on the classpath but it's good to know it's happening).
    .register(ValidationFeature.class);
于 2013-08-02T13:03:47.730 に答える