web-dev-qa-db-ja.com

Spring-Data-MongoDBでオブジェクトを検証するにはどうすればよいですか?

Spring-Data-Mongodbを使用する非常に単純なSpringBootアプリケーションがあります

保存するオブジェクトにはユーザー名が必要であるという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);
    }

}
18
Zac Tolley

まず、クラスパスにJSR-303バリデーターがあることを確認します。次に例を示します。

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

Java configを使用する場合、2つのBeanを作成する方法があります。

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

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

Voilà!現在、検証が機能しています。

35

追加すると

public User addUser(@RequestBody  @Valid User newUser, 
                   BindingResult bindingResult) throws Exception {

  if (bindingResult.hasErrors()) {
    throw new Exception("Validation Error");
  }

私のコントローラーに対して、これは私のルールに対して着信jsonを検証しますが、無効なデータでモデルを更新しようとするコードの他の部分をインターセプトするようにvalidatingMongoEventListenerをセットアップする必要があります。

1
Zac Tolley

コンテキストにValidatorを追加することは良い最初のステップですが、あなたがそれを要求しない限り、それが何かと相互作用するとは思いません。 Spring Dataの担当者はおそらく確かに言うことができますが、一部のリスナーも明示的に宣言する必要があると思います。 この機能に関する古いブログ がありますが、私ができる限り簡単にグーグルで見つけることができます。

Spring Boot に便利な自動設定機能があると思われる場合は、githubで詳細な提案を行ってください。

1
Dave Syer