![](/img/trans.png)
[英]How to do Bean Validation with Hibernate Validation in Spring Boot app?
[英]How to disable Hibernate validation in a Spring Boot project
我有一個 Spring Boot 項目,它有一個 CrudRepository、一個實體和一個控制器。 我基本上是在嘗試根據傳遞給控制器的數據來持久化一個實體。
為此,我使用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;
}
}
似乎正在發生的是,驗證正在運行兩次。 一次通過@Valid
注釋進入控制器,一次當 Hibernate 嘗試持久化對象時。 但是,當 Hibernate 嘗試持久化對象時,它會拋出:
javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`
這似乎是因為它沒有彈簧意識並且無法將依賴項注入到構造函數中。 所以,我想要做的是完全禁用 Hibernate 驗證(因為它是冗余的並且已經在控制器中發生)。
似乎有一個名為javax.persistence.validation.mode
的屬性,您可以將其設置為none
。 但是,我一生都無法弄清楚在基於代碼的配置中將它設置在哪里。
我意識到有像JSR-303 依賴注入和 Hibernate 這樣的問題,但這些都是使用 xml 配置和手動配置持久層的部分。
我想要做的是“后配置”Spring Boot 為我創建的持久層的必需部分,因為如果我定義自己的,那么我就不再利用 Spring Boot 的自動配置。 任何人都可以幫助我確定 1) 這是否可行以及 2) 我需要配置哪些部分以及如何配置?
謝謝!
作為 [M. Deinum] 在我原帖的評論中提到,解決方法是設置:
spring.jpa.properties.javax.persistence.validation.mode=none
在application.properties
文件中。
此外, 這里描述了這種行為(很容易錯過,因為沒有提供示例)。
@Erin Drummond 的答案是用於數據庫實體驗證(單個記錄)
但是,如果有人遇到以下屬性的模式驗證問題,則效果很好。
# Hibernate ddl auto (create, create-drop, validate, update, none)
spring.jpa.hibernate.ddl-auto=none
實際上,在 spring boot 2.x 中。 這是:
spring.jpa.hibernate.ddl-auto: none
對於 spring 引導,除非您添加驗證依賴項,否則 spring 驗證不會啟動。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.