找回密码
 立即注册
相关推荐换一批
  1. GB∕T 22683-2021 家用和类似用途控制器产品型号编制方法
  2. JJG (粤) 028-2016 电子压力控制器
  3. GB∕T 36512-2018 飞机固态远程功率控制器通用要求
  4. GB/T 34121-2017 智能变电站继电保护配置工具技术规范
  5. GB∕T 32503.2-2018 家用和类似用途变频控制器的安全 第2部分:热泵、空调器和除湿?
  6. JB/T 8592-2013 家用和类似用途电自动控制器 电磁四通换向阀
  7. GB/T 29486-2013 家用和类似用途变频控制器 术语
  8. CB/T 4169-2011 航行信号灯控制器(箱)
  9. TB/T 1391-2007 机车司机控制器
  10. GB/T 22710-2008 低压断路器用电子式控制器
  11. GB 14536.1-2008 家用和类似用途电自动控制器 第1部分:通用要求
  12. GB 14536.9-2008 家用和类似用途电自动控制器 电动水阀的特殊要求(包括机械要求)
  13. GB 50444-2008 建筑灭火器配置验收及检查规范
  14. GB/T 15969.3-2005 可编程序控制器 第3部分: 编程语言
  15. SJ/T 10583-1994 气体质量流量控制器通用技术条件
  16. GB 12663-1990 防盗报警控制器 通用技术条件
  17. YDJ 1-1989 邮电通信电源设备安装设计规范
  18. GB 14536.17-2005 家用和类似用途电自动控制器 锅炉器具中使用的浮子型或电极敏感型
  19. JB/T 8220-1999 工业过程控制系统用位式控制器 性能评定方法
  20. GB 14536.14-1998 家用和类似用途电自动控制器 家用洗衣机电脑程序控制器的特殊要求
  21. GB 14536.9-1996 家用和类似用途电自动控制器 电动水阀的特殊要求(包括机械要求)
  22. GB 14536.8-1996 家用和类似用途电自动控制器 定时器和定时开关的特殊要求
  23. GB 14536.7-1996 家用和类似用途电自动控制器 压力敏感电自动控制器的特殊要求(包括
问题
我有一个 Spring Boot 项目,它有一个 CrudRepository、一个实体和一个控制器。我基本上是根据传递给控制器??的数据来持久化一个实体。

为此,我使用 spring-boot-starter-jpa 。我的实体使用 JSR-303 注释进行注释,这些注释在数据传递到 CrudRepository 以进行持久性之前在控制器中签入。

控制器方法:
  1. @RequestMapping(value = "users", method = { RequestMethod.POST })
  2. public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
  3.     if (validation.hasErrors()) {
  4.         throw new ValidationException(validation);
  5.     }
  6.     User saved = this.users.save(user);
  7.     return new SuccessfulResponse<User>(saved);
  8. }
复制代码

实体:
  1. @Entity /* JPA */
  2. public class User {

  3.    @Id /* JPA */
  4.    @Column(name=&quot;email_address&quot;, nullable=false, length=255) /* JPA */
  5.    @UserUnique
  6.    private String emailAddress;

  7. }
复制代码

我的问题的原因是 UserUnique 注释。它的验证器如下所示:
  1. public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {

  2.    private UserRepository users;

  3.    @Autowired
  4.    public UserUniqueValidator(UserRepository users) {
  5.        this.users = users;
  6.    }

  7.    @Override
  8.    public void initialize(UserUnique annotation) {}

  9.    @Override
  10.    public boolean isValid(String value, ConstraintValidatorContext context) {
  11.        return users.findOne(value) == null;
  12.    }
  13. }
复制代码

似乎正在发生的是验证运行了两次。通过 @Valid 注释进入控制器,当 Hibernate 尝试持久化对象时。但是,当 Hibernate 尝试持久化对象时,它会抛出:

javax.validation.ValidationException:HV000064:无法实例化ConstraintValidator:类test.UserUniqueValidator`

这似乎是因为它不支持spring,并且无法将依赖项注入构造函数。所以,我所做的是完全禁用 Hibernate 验证(因为它是多余的并且已经在控制器中发生)。

似乎有一个名为 javax.persistence.validation.mode 的属性可以设置为 none 。但是,在我的一生中,我找不到在基于代码的配置中设置它的位置。

我意识到有一些问题,比如 JSR-303 依赖注入和 Hibernate,但这些都是使用 xml 配置和手动配置持久层的一部分。

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

谢谢!

回答
正如我在原始文章评论中提到的[M.Deinum],解决方案是设置:

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

在 application.properties 文件中。

此外,此处描述了此行为(由于未提供示例,因此很容易忽略此行为)。





上一篇:如何在 Ruby 中使用变量访问符号哈希键
下一篇:如何判断我的 R 脚本中没有使用哪些包?