加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:19:01 所属栏目:Java 来源:网络整理
导读:我有一个弹簧引导项目,它有一个CrudRepository,一个实体和一个Controller.我基本上试图根据传递给控制器??的数据来持久化一个实体. 为此,我使用spring-boot-starter-jpa.我的实体使用JSR-303注释进行注释,这些注释在将数据传递到CrudRepository以进行持久性
我有一个弹簧引导项目,它有一个CrudRepository,一个实体和一个Controller.我基本上试图根据传递给控制器??的数据来持久化一个实体.

为此,我使用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配置和手动配置部分的持久层.

我想做的是“后配置”Spring Boot为我创建的持久层所需的部分,因为如果我定义了自己的,那么我不再使用Spring Boot的自动配置.任何人都可以帮我确定是否1)这是可能的和2)哪些部分我需要配置和如何?

谢谢!

解决方法

作为[M. Deinum]在对我的原始帖子的评论中提到,解决方案是设置:
spring.jpa.properties.javax.persistence.validation.mode=none

在application.properties文件中.

另外,这个行为是described here(容易错过,因为没有提供示例).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读