【问题标题】:How to define which validation group should be used for a Spring Data Repository action?如何定义应将哪个验证组用于 Spring Data Repository 操作?
【发布时间】:2019-11-09 14:31:21
【问题描述】:

我有一个 JPA Spring 数据存储库。我可以以某种方式定义 Hibernate 用于给定操作的验证组(比如说保存)吗?在某些情况下,我需要验证某些组,而在其他情况下则不需要。这将取决于服务水平。 Spring Data 可以吗?

我也可以,如果我可以定义验证组,只为新对象调用,而不是更新。

【问题讨论】:

  • 你将如何使用 JPA 来做到这一点?
  • @SimonMartinelli 我不知道。我只知道,如果你使用 Bean Validators,你可以定义应该被验证的 ValidationGroups。我认为 JPA/Spring Data 也有这样的能力(因为它们在内部使用 bean 验证)
  • 为了使用验证器组进行验证,您必须明确使用相应组的验证方法。
  • 问题在于 JPA 无法做到这一点,而 Spring Data JPA 不提供底层技术无法提供的东西。您必须在业务逻辑中使用 beanvalidation,然后您可以指定组

标签: spring spring-data-jpa spring-data bean-validation


【解决方案1】:

哎呀。对不起。此解决方案适用于 Spring Data Rest。

如果您使用 Spring Data JPA,则必须在每次 JPA 调用之前手动进行验证。

-----已编辑

@Configuration
@RequiredArgsConstructor
protected class RepositoryConfig implements RepositoryRestConfigurer {
  private static final String BEFORE_CREATE = "beforeCreate";
  private static final String BEFORE_SAVE = "beforeSave";

  @Override
  public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
    validatingListener.addValidator(BEFORE_CREATE, createValidator());
    validatingListener.addValidator(BEFORE_SAVE, saveValidator());
  }
}

实现 createValidator()saveValidator() bean:

public class CreateValidator implements Validator {
  private final LocalValidatorFactoryBean smartValidator;

  @Override
  public boolean supports(Class<?> clazz) {
    return true;
  }

  @Override
  public void validate(Object target, Errors errors) {
    smartValidator.validate(target, errors, {whatEverHintsYouWant} );
  }
}

将服务 bean 注入其中并在需要时计算提示。

您甚至可以使用supports 方法为每个实体创建不同的验证器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多