Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring引导项目中禁用Hibernate验证_Java_Hibernate_Jpa_Spring Boot_Bean Validation - Fatal编程技术网

Java 如何在Spring引导项目中禁用Hibernate验证

Java 如何在Spring引导项目中禁用Hibernate验证,java,hibernate,jpa,spring-boot,bean-validation,Java,Hibernate,Jpa,Spring Boot,Bean Validation,我有一个springboot项目,它有一个crudepository、一个实体和一个控制器。我基本上是基于传递给控制器的数据来持久化实体 为此,我使用了springbootstarterjpa。我的实体使用JSR-303注释进行注释,这些注释在数据传递到Crudepository进行持久化之前在控制器中进行检查 控制器方法: @RequestMapping(value = "users", method = { RequestMethod.POST }) public SuccessfulRes

我有一个springboot项目,它有一个crudepository、一个实体和一个控制器。我基本上是基于传递给控制器的数据来持久化实体

为此,我使用了
springbootstarterjpa
。我的实体使用JSR-303注释进行注释,这些注释在数据传递到Crudepository进行持久化之前在控制器中进行检查

控制器方法:

@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);
}
问题的原因是
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;
   }
}
这似乎是因为它不支持spring,并且无法将依赖项注入构造函数。所以,我想做的是完全禁用Hibernate验证(因为它是冗余的,并且已经在控制器中发生)

似乎有一个名为
javax.persistence.validation.mode的属性,您可以将其设置为
none
。然而,我一辈子都不知道在基于代码的配置中在哪里设置它

我意识到有这样的问题,但这些都是使用xml配置和手动配置持久层的一部分

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


谢谢

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

spring.jpa.properties.javax.persistence.validation.mode=none
application.properties
文件中

此外,这种行为是(因为没有提供示例,所以很容易忽略)。

用于数据库实体验证(单个记录)

但是,如果有人在模式验证方面遇到问题,下面的属性会很好地工作

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

实际上,在SpringBoot2.x中。它是:

spring.jpa.hibernate.ddl-auto: none

对于spring引导,除非添加验证依赖项,否则spring验证不会生效

 <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-validation</artifactId> 
</dependency>

org.springframework.boot
弹簧启动启动器验证

将属性添加到
应用程序.properties
文件中
spring.jpa.properties.javax.persistence.validation.mode=none应该可以做到这一点。非常好,谢谢。在任何spring文档中都提到了吗?如何设置附加的JPA属性在参考指南中进行了解释。哦,对了,就是这样。我错过了它,因为这个例子似乎是特定于Hibernate而不是JPA泛型的,我应该更仔细地阅读这个例子下面的段落。仅供参考,您实际上不需要在控制器中处理无效的对象。如果删除BindingResult参数,spring本身将抛出MethodArgumentNotValidException。您可以在带有@ExceptionHandler(MethodArgumentNotValidException)的@ControllerAdvice中很好地处理它方法。这与Hibernate是否会尝试在您的数据库上运行DDL语句以创建其结构有关-这与验证无关…在这里,如果我使用
validate
选项,它会将我的实体与DB tables schemaYes进行比较,而这不是该问题所涉及的验证类型。这个问题是关于数据库实体验证(单个记录)-而不是模式验证。我的错!!我没有仔细理解这个问题。无论如何,将编辑答案。
spring.jpa.hibernate.ddl auto
hibernate.hbm2ddl.auto
,这与自动模式生成有关,但这里的问题与验证实体有关。
spring.jpa.hibernate.ddl-auto: none
 <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-validation</artifactId> 
</dependency>