0

クラス フィールドに JSR 303 検証アノテーションが定義されたクラスがたくさんあります。ORM と遅延読み込みを使用しているため、フィールドではなくゲッターで制約を定義する必要があるという問題があります ( ORM 統合)。

モデル定義全体の変更に時間を費やしたくありません。したがって、私の考えは、実行時に制約を移動することです。exampleのようにBeanDescriptorで制約定義を取得できることがわかりました。フィールド レベルで定義されたすべての制約にアクセスできます。

私の問題は、現在の制約を変更するためのセッターメソッドがないことです。コードをデバッグすると、制約を getter アクセスに移動するために変更する必要があるのは 2 つのポイントだけであることがわかりましたが、どうすればよいかわかりません。

{MetaConstraint{constraintType=javax.validation.constraints.NotNull, location=BeanConstraintLocation{beanClass=ServiceAddress, propertyName='isVirtual' }}=java.lang.Object@56811df,

MetaConstraint{constraintType=org.hibernate.validator.constraints.NotEmpty, location=BeanConstraintLocation{beanClass=ServiceAddress, propertyName='postalCode' }}=java.lang.Object@56811df,

MetaConstraint{constraintType=org.hibernate.validator.constraints.NotEmpty, location=BeanConstraintLocation{beanClass=ServiceAddress, propertyName='code' }}=java.lang.Object@56811df,

...}

ありがとう、あなたの助けを願っています。

4

1 に答える 1

1

簡単な答えは、モデルを更新する必要があるということです:-)

実行時にアクセス タイプを変更する方法はありません。参照しているメタデータ API (BeanDescriptor 経由) は、読み取り専用のデータ構造です。これを使用して、既存の制約を変更または構成することはできません。何らかのハックで動作させることができたとしても、Validator のマイナー バージョン変更の間でも変更される可能性のある実装の詳細に依存するため、いつでも壊れる可能性があります。

また、ソフトウェアのさらなる進化についても考えてください。ソフトウェアを保守または強化する必要がある他の人々は、フィールドに課せられた制約を見て、フィールド アクセスが使用されていると想定します。

あなたの最善の選択肢は、制約を移動することだと思います。

于 2013-06-19T09:21:41.017 に答える