1

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 つのエンティティには問題のある一時的なフィールドがあります。

何か案は?その経験はありますか?

4

1 に答える 1

1

OK、提案が来なかったので、自分で答えさせてください:)

私は一時的なフィールドに特別な検証グループを持つことになりました.このグループにTraversableResolverは、チェックするだけの別の実装を実装しました.私はまだ検証済みのエンティティに直接いますか?

これは、チェックインによって行われます。TraversableResolver.isReachableここpathToTraversableObjectで、空の Strnig がチェックされます。

解決策の理由は、関連するエンティティを検証できなかったためです。これは、これらに検証が必要かどうか (変更されたかどうか) を判断できなかったためです。しかし、私が提出しているものは確かに検証が必要です。

于 2012-11-23T08:01:58.113 に答える