1

@Transient在标记为和的字段上使用休眠验证器进行验证失败@NotNull。然而,它只对那些已经存储在数据库中但现在在对象树中遍历的对象失败。(因为它们的值当然是空的)

对于这样的实体:

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

然而,这些并没有涵盖我的情况(对相关对象有违规行为)。而且我还没有遇到服务器端的验证问题:)。至于测试那将是下一步。

所以问题是,有没有办法解释验证器,在验证期间应该跳过从数据库中获取的传递对象?

我正在考虑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 个相关实体)的情况,其中检查将在其中一个上进行,而另一个将有问题的瞬态字段。

有任何想法吗?有这方面的经验吗?

4

1 回答 1

1

好的,由于没有建议,让我自己回答:)

我最终在瞬态字段上有了特殊的验证组,对于这个组我实现了单独TraversableResolver的检查,我是否仍然直接在经过验证的实体中?

这是通过签入完成的:TraversableResolver.isReachable在哪里pathToTraversableObject检查空的 Strnig。

解决方案的原因是我无法验证相关实体,因为我无法决定这些实体是否需要验证(是否已修改)。但是我提交的那个肯定需要验证。

于 2012-11-23T08:01:58.113 回答