hibernate バリデーターを使用した検証は、 および としてマークされたフィールドで失敗し@Transient
ます@NotNull
。ただし、DB に既に格納されているが、現在はオブジェクトのツリーでトラバースされているものに対してのみ失敗します。(もちろん、それらの値はnullであるため)
このようなエンティティの場合:
public class User {
@ManyToMany
@Fetch(org.hibernate.annotations.FetchMode.JOIN)
@Valid
private Set<Role> roles;
@NotNull
private String someField;
}
public class Role {
@ManyToMany
@Fetch(org.hibernate.annotations.FetchMode.JOIN)
@Valid
private Set<User> users;
}
の検証を行うUser
と、特定Role
の問題を抱えているユーザーが増えているため、現在のユーザー検証が成功したとしても、他のユーザーに対してはエラーが発生します。
サーバー側にデータを送信する前に、クライアント側でこの検証を行います。
@Transient
との検証に関する問題を修正する方法についていくつかのアイデアを見てきました@NotNull
。
ただし、これらは私の場合(関連オブジェクトに違反がある場合)をカバーしていませんでした。さらに、サーバー側での検証の問題にはまだ遭遇していません:)。テストに関しては、それが次のステップになります。
質問は、バリデーターを説明する方法はありますか?DB からフェッチされた推移的なオブジェクトは、検証中にスキップする必要がありますか?
JPATraversableResolver
私は現在使用しているものをオーバーライドして拡張することを考えていました:
/**
* Determine if the Bean Validation provider is allowed to reach the property state
*
* @param traversableObject object hosting <code>traversableProperty</code> or null
* if validateValue is called
* @param traversableProperty the traversable property.
* @param rootBeanType type of the root object passed to the Validator.
* @param pathToTraversableObject path from the root object to
* <code>traversableObject</code>
* (using the path specification defined by Bean Validator).
* @param elementType either <code>FIELD</code> or <code>METHOD</code>.
*
* @return <code>true</code> if the Bean Validation provider is allowed to
* reach the property state, <code>false</code> otherwise.
*/
boolean isReachable(Object traversableObject,
Path.Node traversableProperty,
Class<?> rootBeanType,
Path pathToTraversableObject,
ElementType elementType);
ただし、チェックするプロパティとチェックしないプロパティを決定するという問題に直面しています。私のチェックが現在永続化されているオブジェクトの一時的なフィールドに対するものである場合、永続化されたエンティティ (2 つの関連するもの) のケースはカバーしません。この場合、チェックはそれらの 1 つにあり、もう 1 つのエンティティには問題のある一時的なフィールドがあります。
何か案は?その経験はありますか?