Spring Boot 1.3.8 +休眠在JPA端对ConstraintValidator进行双重初始化

时间:2018-08-27 15:41:23

标签: java hibernate validation spring-boot spring-data-jpa

这个问题经常出现,但是我提出了一个新的水平(看起来)。 已经研究了几个小时。

具有一个带有休眠状态的弹簧靴(发行版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。什么都没有。

0 个答案:

没有答案