【问题标题】:How to I get Spring-Data-MongoDB to validate my objects?如何让 Spring-Data-MongoDB 验证我的对象?
【发布时间】:2014-04-29 10:08:34
【问题描述】:

我有一个使用 Spring-Data-Mongodb 的非常简单的 Spring Boot 应用程序

我要做的就是设置一个 JSR-303 验证规则,说明我要保存的对象必须有一个用户名。我读到 JSR-303 在 1.1 版中被添加到 spring-data-mongodb 中,所以我假设当我保存一个对象时它已经过验证,但事实并非如此。

有没有人有一个简单的示例设置来说明它是如何工作的?

我的用户 pojo 看起来像

public class User {

    @Id
    private String id;

    @NotNull(message = "User Name is compulsory")
    private String userName;
    private String password;

    public User() {}

    public String getId() {
      return id;
    }
    public void setId(String id) {
      this.id = id;
    }

    public String getUserName() {
      return userName;
    }
    public void setUserName(String userName) {
      this.userName = userName;
    }


    public String getPassword() {
      return password;
    }
    public void setPassword(String password) {
      this.password = PasswordAuthService.hash(password);
    }
}

我在某处看到只有在上下文中创建了验证器时才会启动验证,所以我尝试更新我的 Application 类(它包含所有配置,看起来像

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    @Bean
    public Validator getValidator() {
      LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
      return validator;
    }

    public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
    }

}

【问题讨论】:

    标签: mongodb bean-validation spring-data-mongodb spring-boot


    【解决方案1】:

    在上下文中添加Validator 是一个很好的第一步,但我认为除非你要求它,否则它不会与任何东西交互。 Spring Data 人员可能可以肯定地说,但我认为您还需要明确声明一些侦听器。有一个old blog on the feature,但你可以通过谷歌搜索找到它。

    如果您认为Spring Boot 中有一个有用的自动配置功能,请随时在 github 上提出详细的建议。

    【讨论】:

    • 我看到了那篇博文,但我也看到写这篇文章的人后来被 Spring 团队要求将他所做的工作合并回核心 Spring-Data-Mongodb 项目中。跨度>
    • 我明白了。但是您是否还需要添加ValidatingMongoEventListener 类型的bean?
    • 我就是那个人。事实上,这一更改已集成在 1.1.0 版本中,当时,使用 Spring Data MongoDB 的 xml 配置,验证工作开箱即用。 @DaveSyer - 我认为它实际上应该是 Spring Data MongoDB 项目中的一个功能,而不是 Spring Boot - 以类似于实现 EnableMongoRepositories 和 EnableMongoAuditing 的方式
    • 这听起来很对。也许我们可以在github 中讨论?
    【解决方案2】:

    我发现如果我添加

    public User addUser(@RequestBody  @Valid User newUser, 
                       BindingResult bindingResult) throws Exception {
    
      if (bindingResult.hasErrors()) {
        throw new Exception("Validation Error");
      }
    

    对于我的控制器,这会根据我的规则验证传入的 json,但我仍应尝试设置 validatingMongoEventListener 以拦截我的代码中尝试使用无效数据更新模型的任何其他部分。

    【讨论】:

      【解决方案3】:

      首先确保类路径上有 JSR-303 验证器,例如:

      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>4.2.0.Final</version>
      </dependency>
      

      如果你使用 Java 配置,方法是创建 2 个 bean:

      @Bean
      public ValidatingMongoEventListener validatingMongoEventListener() {
          return new ValidatingMongoEventListener(validator());
      }
      
      @Bean
      public LocalValidatorFactoryBean validator() {
          return new LocalValidatorFactoryBean();
      }
      

      瞧!验证正在进行中。

      【讨论】:

      • @ZacTolley 而你没有提供文章链接?
      【解决方案4】:

      从 Spring Boot 2.3 开始,必须在 pom.xml 中添加 spring-boot-starter-validation 依赖项(对于 Maven):

      <dependency> 
          <groupId>org.springframework.boot</groupId> 
          <artifactId>spring-boot-starter-validation</artifactId> 
      </dependency>
      

      不需要声明验证器 bean。

      【讨论】:

        猜你喜欢
        • 2015-03-23
        • 1970-01-01
        • 2017-11-11
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        相关资源
        最近更新 更多