簡體   English   中英

如何在 Spring Boot 項目中禁用 Hibernate 驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM