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)どの部品を構成する必要があるか、どのように判断するのを手伝ってくれますか
ありがとう!
として[M. Deinum]私の元の投稿のコメントで言及された、解決策は設定することです:
spring.jpa.properties.javax.persistence.validation.mode=none
の中に application.properties
ファイル。
さらに、この動作は ここで説明 (例が提供されていないため見落としやすい)です。