CrudRepository、エンティティ、コントローラーを含む Spring Boot プロジェクトがあります。基本的には、コントローラーに渡されたデータに基づいてエンティティを永続化しようとしています。
これを実現するために、私は を使用していますspring-boot-starter-jpa
。私のエンティティはJSR-303アノテーションで注釈付けされており、コントローラでチェックされています。前にデータは永続化のために CrudRepository に渡されます。
コントローラーメソッド:
@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 回実行されているようです。1 回はコントローラーでアノテーション経由で@Valid
、もう 1 回は Hibernate がオブジェクトを永続化しようとしたときに実行されます。ただし、Hibernate がオブジェクトを永続化しようとすると、次のエラーがスローされます。
javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`
これは、Spring に対応しておらず、依存関係をコンストラクターに挿入できないためと思われます。したがって、私がやりたいのは、Hibernate 検証を完全に無効にすることです (冗長であり、コントローラーで既に実行されているため)。
javax.persistence.validation.mode
に設定できるというプロパティがあるようですnone
。ただし、コードベースの構成でどこに設定すればよいのか、どうしてもわかりません。
次のような疑問があることは承知していますJSR-303 依存性注入と Hibernateただし、これらはすべて XML 構成を使用しており、永続性レイヤーの一部を手動で構成しています。
私がやりたいのは、Spring Boot が作成する永続化レイヤーの必要な部分を「事後構成」することです。自分で定義すると、Spring Boot の自動構成を利用できなくなるためです。1) これが可能かどうか、2) どの部分をどのように構成する必要があるかを判断するのを手伝ってくれる人はいますか?
ありがとう!
ベストアンサー1
[M. Deinum] が私の最初の投稿へのコメントで述べたように、解決策は次のように設定することです。
spring.jpa.properties.javax.persistence.validation.mode=none
ファイル内application.properties
。
さらに、この行動はここで説明(例が示されていないため、見逃しやすいです)。