如何在Spring Boot项目中禁用Hibernate验证

问题描述 投票:28回答:2

我有一个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 dependency injection and Hibernate之类的问题,但是这些都使用xml config并手动配置持久层的某些部分。

我想要做的是“后配置” Spring Boot为我创建的持久层的必需部分,因为如果定义自己的持久层,那么我将不再利用Spring Boot的自动配置。谁能帮助我确定1)是否可行,2)我需要配置哪些部分以及如何配置?

谢谢!

java hibernate jpa spring-boot bean-validation
2个回答
28
投票
作为[M. Deinum]在我的原始帖子的评论中提到,解决方法是设置:

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

application.properties文件中。

此外,此行为为described here(由于未提供示例,因此很容易遗漏)。


-1
投票
@Erin Drummond's Answer用于数据库

实体验证(个人记录)

但是如果有人遇到下面属性的[[模式验证问题,效果很好。

# Hibernate ddl auto (create, create-drop, validate, update, none) spring.jpa.hibernate.ddl-auto=none

© www.soinside.com 2019 - 2024. All rights reserved.