web-dev-qa-db-ja.com

Spring BootプロジェクトでHibernate検証を無効にする方法

CrudRepository、Entity、Controllerを含むスプリングブートプロジェクトがあります。基本的に、コントローラーに渡されたデータに基づいてエンティティを永続化しようとしています。

これを行うには、spring-boot-starter-jpaを使用しています。エンティティには、データが永続化のためにCrudRepositoryに渡される前にコントローラーでチェックされるJSR-303注釈が付けられています。

コントローラー方式:

@RequestMapping(value = "users", method = { RequestMethod.POST })
public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
    if (validation.hasErrors()) {
        throw new ValidationException(validation);
    }
    User saved = this.users.save(user);
    return new SuccessfulResponse<User>(saved);
}

エンティティ:

@Entity /* JPA */
public class User {

   @Id /* JPA */
   @Column(name="email_address", nullable=false, length=255) /* JPA */
   @UserUnique
   private String emailAddress;

}

私の問題の原因はUserUnique注釈です。そのバリデータは次のようになります。

public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {

   private UserRepository users;

   @Autowired
   public UserUniqueValidator(UserRepository users) {
       this.users = users;
   }

   @Override
   public void initialize(UserUnique annotation) {}

   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
       return users.findOne(value) == null;
   }
}

何が起こっているようだ、検証が2回実行されています。 @Validアノテーションを介してコントローラーに1回、Hibernateがオブジェクトを永続化しようとするときに1回。ただし、Hibernateがオブジェクトを永続化しようとすると、以下がスローされます。

javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`

これは、スプリングに対応しておらず、依存関係をコンストラクターに注入できないためです。したがって、私がやりたいのは、Hibernateの検証を完全に無効にすることです(冗長で既にコントローラーで行われているため)。

noneに設定できるjavax.persistence.validation.modeというプロパティがあるようです。ただし、コードベースの構成のどこに設定すればよいかはわかりません。

JSR-303依存性注入とHibernate のような質問があることに気付きましたが、これらはすべてxml configを使用し、永続層の一部を手動で構成しています。

私がしたいのは、Spring Bootが私のために作成する永続層の必要な部分を「設定後」にすることです。自分で定義すると、Spring Bootの自動設定を利用しなくなるからです。 1)これが可能かどうか、2)どの部品を構成する必要があるか、どのように判断するのを手伝ってくれますか

ありがとう!

27
Erin Drummond

として[M. Deinum]私の元の投稿のコメントで言及された、解決策は設定することです:

spring.jpa.properties.javax.persistence.validation.mode=none

の中に application.propertiesファイル。

さらに、この動作は ここで説明 (例が提供されていないため見落としやすい)です。

28
Erin Drummond