hibernate - @EntityListeners 注解导致 TypeNotPresentExceptionProxy 错误

标签 hibernate jpa spring-data spring-data-jpa hibernate-jpa

我有一个看起来像这样的 JPA 实体。请注意 @EntityListeners 注释:

import javax.persistence.EntityListeners;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@XmlRootElement
@MappedSuperclass
@EntityListeners( { AuditingEntityListener.class } )
public class BaseEntity implements Serializable
{
    //body
}

我使用 Hibernate 作为 JPA 提供程序。

我使用 Spring 的 LocalContainerEntityManagerFactoryBean 来创建 JPA EntityManager。我使用 setPersistenceUnitPostProcessors 方法设置一个 PersistenceUnitPostProcessor 实例,该实例在 postProcessPersistenceUnitInfo 方法中注册实体类。 (我知道这不是 Spring Boot,但这是另一个话题)。

LocalContainerEntityManagerFactoryBean 上设置 DataSource 和其他属性后,调用 afterPropertiesSet 方法会引发以下异常:

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
    at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724)
    at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531)
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355)
    at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286)
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120)
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72)
    at java.lang.Class.createAnnotationData(Class.java:3521)
    at java.lang.Class.annotationData(Class.java:3510)
    at java.lang.Class.getAnnotation(Class.java:3415)
    at java.lang.reflect.AnnotatedElement.isAnnotationPresent(AnnotatedElement.java:258)
    at java.lang.Class.isAnnotationPresent(Class.java:3425)
    at org.hibernate.annotations.common.reflection.java.JavaAnnotationReader.isAnnotationPresent(JavaAnnotationReader.java:50)
    at org.hibernate.annotations.common.reflection.java.JavaXAnnotatedElement.isAnnotationPresent(JavaXAnnotatedElement.java:60)
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.categorizeAnnotatedClass(AnnotationMetadataSourceProcessorImpl.java:116)
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:105)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:147)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:141)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359)

我注释掉了上面列出的实体类上的 @EntityListeners( { AuditingEntityListener.class } ) 注释。

之后,LocalContainerEntityManagerFactoryBeanafterPropertiesSet() 方法没有抛出错误,并且它生成了一个可用的 EntityManager 实例(我能够使用它来对实体进行基本选择)。所以,至少我知道其余的设置工作正常。

谁能告诉我为什么我在使用@EntityListeners注释时遇到错误,以及如何修复它?据我所知,它位于运行时类路径中(javax.persistence-api-2.2.jar 文件位于 web 应用程序的 WEB-INF/lib 目录中),所以是 AuditingEntityListener 类(位于 spring-data-jpa-1.11.6.RELEASE.jar 文件中)。

如果有帮助,这些是我用来获取依赖项的 Gradle 条目:

compile "org.springframework:spring-core:4.3.7.RELEASE"
compile "org.springframework:spring-beans:4.3.7.RELEASE"
compile "org.springframework:spring-context:4.3.7.RELEASE"

compile "org.springframework.data:spring-data-jpa:1.11.6.RELEASE"
compile "javax.persistence:javax.persistence-api:2.2"
compile "org.hibernate:hibernate-core:5.2.10.Final"

使用 @EntityListeners 注释时如何消除错误?

谢谢!!!

最佳答案

我做了一些更多的测试。我发现这个注释没有产生错误:

@EntityListeners( { } )

因此 AuditingEntityListener 似乎是罪魁祸首。

更多网络搜索出现 this issue in Spring 。它提到 spring-aspects 项目对于 AuditingEntityListener 的运行时代码编织是必需的,因此我将其添加到我的 Gradle 构建文件中:

compile "org.springframework:spring-aspects:4.3.10.RELEASE"

重建并重新部署后,问题就消失了!耶!

关于hibernate - @EntityListeners 注解导致 TypeNotPresentExceptionProxy 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45847325/

相关文章:

java - 具有多级连接的 Hibernate Criteria

java - PersistenceUnit [...] 的部署失败。关闭此 PersistenceUnit 的所有工厂

Spring-data-redis ping 有效, key 存在,没有返回数据

java - 如何在 Spring Boot + Spring Data 中创建自定义数据源

java - 使用 Hibernate/JPA 在运行时抛出 AbstractMethodError

java - 是否可以在包含目标+连接字段的子类上使用@JoinTable?

java - Hibernate 可以对不同于字段名称的实体属性使用逻辑名称吗?

java - Autowiring 时 Hibernate 模板抛出错误

java - 不同的 REST 方法修改同一个对象 - RollbackException、OptimisticLockException、StaleStateException

java - 用对象包裹集合属性