这个问题经常出现,但是我提出了一个新的水平(看起来)。 已经研究了几个小时。
具有一个带有休眠状态的弹簧靴(发行版1.3.8)。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>9</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.8.RELEASE</version>
</parent>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
通过bean注入形成了ConstraintValidator,我通过类型将其绑定到实体: @Target(ElementType.TYPE)
在控制器端,我使用了@Valid注释。
这就是我得到的(特别在日志中标记了“ isValid”): 控制器-> @Valid->记录器告诉isValid被调用(Validator的“ this”给出一个对象地址)
在此之后,有一个调用来保存实体: 控制器->服务-> JPA 从这一点上,我看到再次调用isValid,碰到了自动装配的bean的空引用。记录器显示Validator对象是不同的,并为“ this”输出显示了不同的内存块。
当我用构造函数注入之一删除默认构造函数时,我看到了更清晰的画面: hibernate.newInstance无法找到默认构造函数。
因此,罪魁祸首似乎是JPA,它试图在保存状态下创建并验证实体,并创建验证器的单独实例。
这件事仅在我对实体进行自定义验证时才相关。将其划分为entity-dto,并在DTO上进行了验证,一切都像魅力一样。
尝试了网络上的建议来定义验证器和其他内容,但没有任何效果。
有人可以建议如何在没有DTO(讨厌做实体-dto的重复)的情况下做到这一点吗?
这是一件有趣的事情。 经过几次尝试,设法使用静态和构造函数autowire(无法告诉我昨天在做什么错)保存bean注入,然后isValid开始通过。但是现在,由于调用JPA的通用findByIpAndIdNot,导致在saveAndFlush上出现“空ID”异常。
我显然对此越来越困惑,因为这开始变得松散。在调用之前,我得到了DAO对象是否相同,实体-相同等的验证,但是在那一点上,我从零开始捕获了一个空指针。
尝试从JDK 9切换到8。什么都没有。