Spring Boot 2中EclipseLink的Time Weaver无法正常工作
Spring Boot 2 + EclipseLink 2.7.x 织入异常与懒加载警告解决指南
嘿,我刚好踩过Spring Boot 2升级后搭配EclipseLink 2.7.x的织入坑,给你分享下解决思路和具体步骤!
问题根源
Spring Boot 2.x对类加载和LoadTimeWeaving机制做了不少调整,和EclipseLink 2.7.x的默认适配出现了冲突——之前Spring Boot 1.5.8里默认生效的织入逻辑,在2.0版本里被禁用了,导致EclipseLink无法生成懒加载代理,就出现了你看到的Reverting the lazy setting on the OneToOne or ManyToOne警告,甚至TimeWeaving启动异常。
具体解决步骤
1. 调整依赖,排除Hibernate(如果用了Spring Data JPA Starter)
Spring Boot的JPA Starter默认依赖Hibernate,必须先排除它,再引入EclipseLink:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.1</version> </dependency>
2. 显式配置LoadTimeWeaving与EclipseLink属性
Spring Boot 2.x默认关闭了LoadTimeWeaving,需要创建自定义JPA配置类开启,并指定EclipseLink的织入参数:
@Configuration @EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED) public class EclipseLinkJpaConfig extends JpaBaseConfiguration { // 构造方法继承父类,注入必要依赖 protected EclipseLinkJpaConfig(DataSource dataSource, JpaProperties properties, ObjectProvider<JtaTransactionManager> jtaTransactionManager) { super(dataSource, properties, jtaTransactionManager); } // 指定使用EclipseLink作为JPA实现 @Override protected AbstractJpaVendorAdapter createJpaVendorAdapter() { EclipseLinkJpaVendorAdapter adapter = new EclipseLinkJpaVendorAdapter(); adapter.setShowSql(true); // 可选,按需开启SQL打印 return adapter; } // 设置EclipseLink专属属性,强制开启织入和懒加载织入 @Override protected Map<String, Object> getVendorProperties() { Map<String, Object> props = new HashMap<>(); props.put(PersistenceUnitProperties.WEAVING, "true"); props.put(PersistenceUnitProperties.WEAVING_LAZY, "true"); // 可添加其他EclipseLink配置,比如缓存策略、DDL生成等 return props; } }
3. 添加JVM启动参数,启用织入代理
LoadTimeWeaving需要JVM层面的代理支持,必须在启动时添加-javaagent参数指向Spring的instrument jar:
- Eclipse环境:在Run Configuration的VM Arguments里添加:
注意:版本要和你的Spring Boot 2.x对应(比如Spring Boot 2.0.0.RELEASE对应Spring 5.0.4.RELEASE)。-javaagent:${user.home}/.m2/repository/org/springframework/spring-instrument/5.0.4.RELEASE/spring-instrument-5.0.4.RELEASE.jar - Maven插件启动:在
spring-boot-maven-plugin里配置jvm参数:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-javaagent:${settings.localRepository}/org/springframework/spring-instrument/5.0.4.RELEASE/spring-instrument-5.0.4.RELEASE.jar</jvmArguments> </configuration> </plugin>
4. 解决剩余懒加载警告的额外检查
如果配置后还是出现懒加载回退警告,检查这两点:
- 你的实体类必须是public权限,且不能被
final修饰(因为EclipseLink需要生成代理类继承实体); - 如果使用了
persistence.xml,确保里面也开启了织入:<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> <properties> <property name="eclipselink.weaving" value="true"/> <property name="eclipselink.weaving.lazy" value="true"/> </properties> </persistence-unit>
总结
核心就是恢复Spring Boot 2.x里被禁用的LoadTimeWeaving能力,同时确保EclipseLink的织入参数正确配置,加上JVM层面的代理支持,就能解决升级后的织入异常和懒加载警告问题。
内容的提问来源于stack exchange,提问作者Alisson Godoi
相关产品推荐
相关产品推荐

