Java 如何在Spring引导项目中禁用Hibernate验证
我有一个springboot项目,它有一个crudepository、一个实体和一个控制器。我基本上是基于传递给控制器的数据来持久化实体 为此,我使用了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
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>