验证/过滤添加到关联集合的项目
Validating / filtering items added to associated collection
假设我已经 @Entity
声明了这样的集合:
@ManyToMany(fetch = FetchType.LAZY)
private Set<User> users = new HashSet<>();
稍后,您可以通过调用 <my entity>/{id}/users
来访问它。
如果该集合中有任何类型的插入(通过 POST
、PATCH
或 PUT
和 text/uri-list
内容类型),我想确保您可以只添加符合某些条件的用户(例如 user.age >= 18
)。
如果客户端尝试添加任何其他内容,端点应该 return 出错或至少忽略不匹配的用户。
我该怎么做?
我试过 @Where
子句,但它只是被注入到 SELECT
查询中,尽管行实际上被插入到数据库中。
我试过 @FilterJoinTable
,就像这里:
@FilterJoinTable(name = "hasRightAge", condition = "age >= 18")
private Set<StorageUser> users = new HashSet<>();
但是没有任何效果。
我也可以使用 Spring 的 Validator
,但一定有更好的方法。
您可以在您的字段上使用注释 @Min(18)
。
它来自 Hibernate 验证器:http://hibernate.org/validator/
你也可以用类似的方式使用Spring的Bean验证。 Spring 将在控制器中直接失败,而 Hibernate 将在稍后提交时失败。
我最终使用了附加到 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);
}
假设我已经 @Entity
声明了这样的集合:
@ManyToMany(fetch = FetchType.LAZY)
private Set<User> users = new HashSet<>();
稍后,您可以通过调用 <my entity>/{id}/users
来访问它。
如果该集合中有任何类型的插入(通过 POST
、PATCH
或 PUT
和 text/uri-list
内容类型),我想确保您可以只添加符合某些条件的用户(例如 user.age >= 18
)。
如果客户端尝试添加任何其他内容,端点应该 return 出错或至少忽略不匹配的用户。
我该怎么做?
我试过 @Where
子句,但它只是被注入到 SELECT
查询中,尽管行实际上被插入到数据库中。
我试过 @FilterJoinTable
,就像这里:
@FilterJoinTable(name = "hasRightAge", condition = "age >= 18")
private Set<StorageUser> users = new HashSet<>();
但是没有任何效果。
我也可以使用 Spring 的 Validator
,但一定有更好的方法。
您可以在您的字段上使用注释 @Min(18)
。
它来自 Hibernate 验证器:http://hibernate.org/validator/
你也可以用类似的方式使用Spring的Bean验证。 Spring 将在控制器中直接失败,而 Hibernate 将在稍后提交时失败。
我最终使用了附加到 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);
}