@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 个相关实体)的情况,其中检查将在其中一个上进行,而另一个将有问题的瞬态字段。
有任何想法吗?有这方面的经验吗?