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

时间:2017-06-23 21:33:55

标签: spring hibernate spring-data spring-data-jpa spring-data-rest

让我们说@Entity用这样的集合宣告: @ManyToMany(fetch = FetchType.LAZY) private Set<User> users = new HashSet<>();

稍后,您可以致电<my entity>/{id}/users来访问它。

如果在该集合中有任何类型的插入(通过POSTPATCHPUTtext/uri-list内容类型),我想确保您只能添加符合某些条件的用户(例如user.age >= 18) 如果客户端尝试添加任何其他内容,则端点应返回错误或至少忽略不匹配的用户。

我该怎么做?

我已经尝试了@Where子句,但它只是注入了SELECT个查询,尽管实际上已将行插入到数据库中。 我试过@FilterJoinTable,就像这里一样: @FilterJoinTable(name = "hasRightAge", condition = "age >= 18") private Set<StorageUser> users = new HashSet<>(); 但它没有任何效果。

我也可以使用Spring Validator,但必须有更好的方法。

2 个答案:

答案 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);
    }