当前位置: 首页 > 面试题库 >

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

黄鸣
2023-03-14
问题内容

我有一个包含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;
   }
}

似乎正在发生的事情是,验证运行了两次。一次在控制器中通过@Valid注释,一次在Hibernate尝试持久化对象时。但是,当Hibernate尝试保留该对象时,它将引发:

javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`

这似乎是因为它不具备弹簧意识,无法将依赖项注入到构造函数中。因此,我想做的是完全禁用Hibernate验证(因为它是冗余的,并且已经在控制器中发生)。

似乎有一个javax.persistence.validation.mode可以设置为的属性none。但是,我终生无法找出在基于代码的配置中将其设置在何处。

我意识到存在诸如JSR-303依赖项注入和Hibernate之类的问题,但这些问题都使用xml config并手动配置了持久层的各个部分。

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

谢谢!


问题答案:

如[M. [Deinum]在我的原始帖子的评论中提到,解决方案是设置:

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

application.properties文件中。

此外,此处描述了这种行为(由于未提供示例,因此很容易遗漏)。



 类似资料:
  • 问题内容: 无论项目属性设置为什么,Eclipse的Google插件都会在 web.xml中 自动生成这些行。 有没有办法阻止插件这样做? 问题答案: 在项目属性的构建器下,如果您禁用了Google App Engine项目更改通知程序,则不会再修改web.xml。但是,由于对GAE环境不够敏锐,我无法确定禁用此构建器的副作用是什么。

  • 如何禁用swing组合框中的项目?我将这些项添加为代码,因为在我的项目中,我们无法从设计中手动添加它们。我想禁用项目,例如如果从swing Month组合框中选择了April,则项目31也应禁用,并显示警告消息,因为四月有30天,而不是31天。 {

  • 我有一个,其中有8个项目,我想显示其中的所有项目,但在特定条件下,用户只能选择前两个项目,因此我编写了程序,如果条件为真,用户选择任何其他选项,则会显示一个消息框,显示然后自动选择默认值。到现在为止,一直都还不错。 但现在的问题是,用户无法通过查看的选项来判断他可以选择哪些选项,因此我想做的是,如果条件为真,那么除前两个选项之外的所有选项都应该被禁用(或灰显或其他),这样用户就可以判断出您无法选择

  • 似乎Springboot自动配置自己来使用Tomcat的Logback。我想禁用它,并使用我在类路径中提供的一个。 LoggerFactory不是LoggerContext,但Logback位于类路径上。删除Logback或类[org.slf4j.impl.SimpleLoggerFactory]的竞争实现(类org.slf4j.impl.SimpleLoggerFactory)对象必须是类ch.

  • 问题内容: 我有一个称为hibernate的实体类。 我能够正确地获取属于该类的现有项目,因此我认为这与类的映射无关。 但是,当我尝试插入新项目时,出现以下错误: 在下面的代码中: 如果我不这样做,那么新任务就不会插入数据库中。 我究竟做错了什么? 编辑:也不起作用 问题答案: 在此链接的帮助下可以使用此工具:http : //www.coderanch.com/t/487173/ORM/data

  • 我有一个名为Task的实体类,它在hibernate中映射。 我能够正确获取属于这个类的现有项目,所以我不认为这是类映射的问题。 但是,当我尝试插入新项目时,我会收到以下错误: 在以下代码中: 如果我不执行saveOrUpdate(),则新任务不会插入到数据库中。 我做错了什么? 编辑:<代码>会话。保存(任务)也不起作用