6

プロパティの 1 つを String 配列として持つ単純なクラスがあります。このドキュメントに従って、配列、コレクションなどで @Valid を使用すると、配列/コレクションの各要素が再帰的に検証されます。

@Valid
@Pattern(regexp="^[_ A-Za-z0-9]+$")
public String[] defaultAppAdminRoles;

プロパティの上記の注釈は、次の例外を生成します。

Exception in thread "main" javax.validation.UnexpectedTypeException: No validator could be found for type java.lang.String[]. See: @Pattern at public java.lang.String[] com.hm.vigil.platform.ops.model.Application.defaultAppAdminRoles
at org.apache.bval.jsr303.AnnotationProcessor.checkOneType(AnnotationProcessor.java:326)
at org.apache.bval.jsr303.AnnotationProcessor.getConstraintValidator(AnnotationProcessor.java:301)
at org.apache.bval.jsr303.AnnotationProcessor.applyConstraint(AnnotationProcessor.java:241)
at org.apache.bval.jsr303.AnnotationProcessor.processAnnotation(AnnotationProcessor.java:149)
at org.apache.bval.jsr303.AnnotationProcessor.processAnnotations(AnnotationProcessor.java:90)
at org.apache.bval.jsr303.Jsr303MetaBeanFactory.processClass(Jsr303MetaBeanFactory.java:134)
at org.apache.bval.jsr303.Jsr303MetaBeanFactory.buildMetaBean(Jsr303MetaBeanFactory.java:95)
at org.apache.bval.MetaBeanBuilder.buildForClass(MetaBeanBuilder.java:131)
at org.apache.bval.MetaBeanManager.findForClass(MetaBeanManager.java:102)
at org.apache.bval.jsr303.ClassValidator.validate(ClassValidator.java:140)
at com.hm.vigil.platform.commons.AbstractValidatable.isValid(AbstractValidatable.java:33)
at com.hm.vigil.platform.ops.model.Application.main(Application.java:54)

検証プロバイダーとして Apache BVal を使用しています。

問題は、上記の方法は正しいですか?

正しくない場合、Bean 検証で配列/コレクションを検証する正しい方法は何ですか?

それが正しければ、それは Apache BVal の何らかの制限ですか?

4

3 に答える 3

18

言及する価値のあるもう 1 つのことは、パラメーター化された型に注釈を付けることができる Java 8 の型注釈の導入です。

private List<@MyPattern String> defaultAppAdminRoles;

これはまだ bean-validation 標準には含まれていませんが (確実に次のバージョンで)、hibernate-validator 5.2.1 では既に利用可能です。詳細については、こちらのブログ エントリを参照してください。

于 2015-08-18T14:22:58.593 に答える
3

行ったように注釈を追加することにより@Valid、検証アルゴリズムが各要素に適用されます (要素の制約の検証)。

あなたの場合、 String クラスには制約がありません。追加した@Pattern制約は、配列の各要素ではなく、配列に適用されます。@Pattern配列には制約を適用できないため、エラー メッセージが表示されます。

配列のカスタム検証制約を作成するか (詳細については、Hibernate のドキュメントを参照してください)、言及されている @Jordi Castilla のようなラッパー クラスを使用できます。

于 2015-08-18T10:07:59.253 に答える