让我们说@Entity
用这样的集合宣告:
@ManyToMany(fetch = FetchType.LAZY)
private Set<User> users = new HashSet<>();
稍后,您可以致电<my entity>/{id}/users
来访问它。
如果在该集合中有任何类型的插入(通过POST
,PATCH
或PUT
和text/uri-list
内容类型),我想确保您只能添加符合某些条件的用户(例如user.age >= 18
)
如果客户端尝试添加任何其他内容,则端点应返回错误或至少忽略不匹配的用户。
我该怎么做?
我已经尝试了@Where
子句,但它只是注入了SELECT
个查询,尽管实际上已将行插入到数据库中。
我试过@FilterJoinTable
,就像这里一样:
@FilterJoinTable(name = "hasRightAge", condition = "age >= 18")
private Set<StorageUser> users = new HashSet<>();
但它没有任何效果。
我也可以使用Spring Validator
,但必须有更好的方法。
答案 0 :(得分:0)
您可以在字段上使用注释@Min(18)
它来自Hibernate Validator:http://hibernate.org/validator/
您也可以以类似的方式使用Spring的Bean验证。 Spring将直接在控制器中失败,而Hibernate将在提交后失败。
答案 1 :(得分:0)
我最终使用附加到beforeLinkSave
事件的自定义验证程序。
@Override
public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
super.configureValidatingRepositoryEventListener(validatingListener);
MyCustomValidator validator = new MyCustomValidator(...);
validatingListener.addValidator("beforeSave", validator);
validatingListener.addValidator("beforeCreate", validator);
validatingListener.addValidator("beforeLinkSave", validator);
}