Spring+spring-data-jpa创建EntityManagerFactory抛出数组越界异常如何解决
问题根因
- 报错触发在
org.jboss.jandex.Indexer类的字节码扫描逻辑中,是JDK版本与依赖的Jandex、Hibernate版本不兼容导致:你使用的JDK版本为16及以上,当前依赖的Jandex版本过低,无法解析高版本JDK编译生成的类字节码格式,扫描实体类包时抛出数组越界异常。 - 额外存在2个配置/代码缺陷:
- JPA实体类
CloudUser缺少无参构造函数,Hibernate无法实例化实体对象 EntityManagerFactory配置缺失Hibernate必填的数据库方言等属性配置
- JPA实体类
修复步骤
1. 修复实体类
给CloudUser添加无参构造注解,Lombok场景下直接新增@NoArgsConstructor即可:
@Entity @Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor // 新增这行 public class CloudUser { @Id @GeneratedValue private long id; private UUID uuid; private String lastUserName; private Date lastLogin; private String twitchId; private boolean subbed; }
2. 补全EntityManagerFactory配置
修改entityManagerFactory的Bean定义,补充Hibernate相关属性,同时清理重复配置:
@Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setShowSql(true); vendorAdapter.setGenerateDdl(true); // 新增指定MariaDB方言 vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MariaDBDialect"); LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan("de.nebelniek.database.user"); factory.setDataSource(dataSource()); // 新增Hibernate额外配置 Properties jpaProperties = new Properties(); jpaProperties.put("hibernate.hbm2ddl.auto", "update"); jpaProperties.put("hibernate.format_sql", true); factory.setJpaProperties(jpaProperties); return factory; }
3. 升级兼容版本的依赖
在你的构建文件中显式引入高版本的Jandex依赖,适配高版本JDK:
Maven(pom.xml)
<dependency> <groupId>org.jboss</groupId> <artifactId>jandex</artifactId> <version>2.4.3.Final</version> </dependency>
Gradle(build.gradle)
implementation 'org.jboss:jandex:2.4.3.Final'
如果上述修改后仍然报错,同步升级Hibernate Core版本到5.6.15.Final及以上即可。
内容的提问来源于stack exchange,提问作者Jan Herzog
相关产品推荐
相关产品推荐

