验证/过滤添加到关联集合的项目

Validating / filtering items added to associated collection

假设我已经 @Entity 声明了这样的集合: @ManyToMany(fetch = FetchType.LAZY) private Set<User> users = new HashSet<>();

稍后,您可以通过调用 <my entity>/{id}/users 来访问它。

如果该集合中有任何类型的插入(通过 POSTPATCHPUTtext/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);
    }