3

ラジオ、テキスト、選択、選択マルチのそれぞれ X 数で構成される動的モデルがあります。これは基本的に、バックエンドの EAV データベースのようなものです。

この動的フォームに合計 N 個のフィールドを提示し、送信された動的モデル オブジェクトを検証する必要があります。これは、フィールド定義の正規表現を使用して検証されます。この検証を JSR 303 アノテーションを介して実行したいと考えています。

したがって、機能などを介して、Spring MVC開発を行う典型的な方法を使用してフォームオブジェクトをバインドしたいと思いModelAttribute @Validます。唯一の違いは、モデルオブジェクトがランタイムまで不明/未定義であることです。

私の傾向は、実行時に CGLIB などを使用してクラスを生成し、それを特別な taglib で提示してから、何らかの方法でリフレクションを使用して特別な検証を使用して検証することです。

このようなことは完全に可能性の範囲外ですか?繰り返しますが、通常の Spring MVC コントローラーとモデルを実行したいと思いますが、動的フォーム オブジェクトを使用します。

4

2 に答える 2

1

これは可能ですが、cglib ではできません。Cglib はプロキシ ライブラリであり、既存のメソッドをオーバーライドすることのみを許可しますが、動的モデルを Spring やその他の Bean 検証ライブラリに伝達するために必要な新しいメソッドを定義することはできません。

もちろん、そのようなメタデータを定義できるJavassistまたはByte Buddy(開示:私は著者です)を使用してそのようなクラスを生成することは可能です。たとえば、Byte Buddy では、動的クラスを定義できます。

new ByteBuddy()
  .subclass(Object.class)
  .defineField("foo", String.class, Visibility.PUBLIC)
  .annotateField(AnnotationDescription.Builder.ofType(NotNull.class).build())
  .make();

このコードを使用すると、クラスをロードし、"foo"フィールドに値を割り当てて、この Bean オブジェクトを Bean 検証ライブラリに提示できます。

同時に、このアプローチは過剰に設計されているように感じます。再実装できない特定の JSR 303 バリデーターに互換性を提供する必要がある場合にのみ、このソリューションに取り組みます。それ以外の場合は、データを直接検証することをお勧めします。

フレームワークにゲッターとセッターも必要な場合は、次の方法で追加できます。

builder = builder
  .defineMethod("getFoo", String.class, Visibility.PUBLIC)
    .intercept(FieldAccessor.ofField("foo"));
  .defineMethod("setFoo", void.class, Visibility.PUBLIC)
    .withParameters(String.class)
    .intercept(FieldAccessor.ofField("foo"));
于 2016-11-12T23:52:08.520 に答える