使用javax.persistence开发Spring Batch遇Jakarta API类型转换错误求助
Spring Batch中JPA类型不兼容问题解决
你遇到的错误包含两部分核心问题:API包冲突(javax vs Jakarta) 和 代码本身的类型不匹配错误,以下是具体解决步骤:
一、先修复代码中的低级类型错误
你的配置类里存在明显的类型传参错误:JpaPagingItemReader和JpaItemWriter的setEntityManagerFactory方法要求传入EntityManagerFactory类型,但你却传了EntityManager对象,这和javax/Jakarta的包冲突无关,是代码逻辑错误,先修正这部分:
修改earmarkItemReader和earmarkItemWriter方法:
@Bean public ItemReader<Earmark> earmarkItemReader() { JpaPagingItemReader<Earmark> reader = new JpaPagingItemReader<>(); // 把entityManager替换为已注入的entityManagerFactory reader.setEntityManagerFactory(entityManagerFactory); reader.setQueryString("SELECT e FROM Earmark e WHERE e.status = 'Pending'"); reader.setParameterValues(Collections.emptyMap()); reader.setPageSize(100); return reader; } @Bean public ItemWriter<Earmark> earmarkItemWriter() { JpaItemWriter<Earmark> writer = new JpaItemWriter<>(); // 同样替换为entityManagerFactory writer.setEntityManagerFactory(entityManagerFactory); return writer; }
另外,类中声明的private EntityManager entityManager;没有注入且现在用不到,直接删掉即可。
二、统一依赖版本,解决javax/Jakarta包冲突
你的pom.xml存在严重的版本混乱,这是导致API包冲突的根源:
- Spring Boot 3.x要求Java 17及以上,但你配置的
java.version是1.8,这会直接导致编译错误,先升级Java版本。 - Parent用了Spring Boot 3.0.6,但
spring.boot.version却设为2.6.7,版本不一致,统一为3.0.6。 - 手动引入了
hibernate-jpa-2.1-api(属于javax包),但Spring Boot 3.x和Hibernate 6.x都基于Jakarta EE,这个依赖必须删除。 - Spring Boot Starter会自动管理Hibernate等依赖的版本,尽量不要手动指定版本号,避免冲突。
修改后的pom.xml关键部分:
<properties> <!-- 升级Java版本到17 --> <java.version>17</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <!-- 统一Spring Boot版本与parent保持一致 --> <spring.boot.version>3.0.6</spring.boot.version> </properties> <dependencies> <!-- 保留Spring Boot Starter依赖,自动管理版本 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 删除hibernate-jpa-2.1-api依赖 --> <!-- 其他依赖按需保留,但确保版本与Spring Boot 3.x兼容 --> </dependencies>
三、替换所有javax.persistence引用为jakarta.persistence
Spring Boot 3.x已完全迁移到Jakarta EE规范,不再支持javax包,把项目中所有import javax.persistence.*;替换为import jakarta.persistence.*;,包括配置类、实体类等:
// 替换前 import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; // 替换后 import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory;
总结
- 先修正代码中的类型传参错误,这是导致当前错误提示的直接原因。
- 统一Spring Boot版本,升级Java到17,移除冲突的javax依赖。
- 全局替换javax.persistence为jakarta.persistence,适配Jakarta EE规范。
内容的提问来源于stack exchange,提问作者Shailesh Patil
相关产品推荐
相关产品推荐

