【问题标题】:Validating / filtering items added to associated collection验证/过滤添加到关联集合的项目
【发布时间】:2017-06-23 21:33:54
【问题描述】:

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

稍后,您可以致电&lt;my entity&gt;/{id}/users 访问它。

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

我该怎么做?

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

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

【问题讨论】:

  • 看看 Bean Validation/Hibernate Validator。
  • @RossiRobinsion 我试过使用ConstraintValidator。它的验证方法在对一组新用户执行PATCH 请求时被触发,但在使用POST 请求向集合中添加一个新项目时它们不会被触发。

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


【解决方案1】:

您可以在您的字段上使用注释@Min(18)
它来自 Hibernate 验证器:http://hibernate.org/validator/

您也可以以类似的方式使用 Spring 的 Bean 验证。 Spring 将直接在控制器中失败,而 Hibernate 将在稍后提交时失败。

【讨论】:

  • 我需要对自定义实体 (User) 进行验证,并且仅代替该集合,而不是单个对象的原始类型。我正在尝试使用自定义约束注释,例如:dolszewski.com/spring/custom-validation-annotation-in-spring。据我所见 - 当我直接调用 CrudRepository 方法时会调用验证,但在使用来自 spring-data-rest 的自动生成端点时不会调用它们。换句话说,当我向该集合发出 POST 请求时,验证不会触发。
【解决方案2】:

我最终使用了附加到 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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2014-08-28
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多