Spring Boot+EclipseLink遇loadTimeWeaver Bean创建错误求助
Spring Boot + EclipseLink 加载时织入(LoadTimeWeaver)错误解决
我是Spring Boot新手,尝试用EclipseLink连接Docker容器中的数据库,实现JSON数据的存储与读取功能,但启动时遇到错误:
Error creating bean with name 'loadTimeWeaver' defined in class path resource
以下是原配置和代码:
原pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.10</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>de.cibplus</groupId> <artifactId>cibplus-ng-vdp-GKZ</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>cibplus-ng-vdp-GKZ</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> <eclipselink.version>2.7.8</eclipselink.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> </exclusion> <exclusion> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.jpa</artifactId> <version>${eclipselink.version}</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> <!-- <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> <scope>provided</scope> </dependency> <!-- <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <configuration> <executable>java</executable> <arguments> <argument>-Xmx1000m</argument> <argument>-javaagent:${settings.localRepository}/org/eclipse/persistence/org.eclipse.persistence.jpa/${eclipselink.version}/org.eclipse.persistence.jpa-${eclipselink.version}.jar</argument> <argument>-classpath</argument> <classpath/> <argument>de.cibplus.cibplusngvdpGKZ.CibplusNgVdpGkzApplication</argument> </arguments> </configuration> </plugin> </plugins> </build> </project>
原JpaConfiguration.java代码
package de.cibplus.cibplusngvdpGKZ; import java.util.Map; import java.util.Properties; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableLoadTimeWeaving; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter; import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; @Configuration @EnableJpaAuditing @EnableLoadTimeWeaving @EnableAutoConfiguration public class JpaConfiguration extends JpaBaseConfiguration { public JpaConfiguration(DataSource dataSource, JpaProperties props, ObjectProvider<JtaTransactionManager> txm) { super(dataSource, props, txm); } @Bean public EntityManagerFactory entityManagerFactory() { AbstractJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter(); vendorAdapter.setGenerateDdl(false); LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); Properties properties = new Properties(); properties.setProperty("eclipselink.weaving", "static"); factory.setJpaProperties(properties); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan("de.cibplus.cibplusngvdpGKZ.Repository"); factory.afterPropertiesSet(); return factory.getObject(); } @Bean public PlatformTransactionManager transactionManager() { JpaTransactionManager txManager = new JpaTransactionManager(); txManager.setEntityManagerFactory(entityManagerFactory()); return txManager; } protected AbstractJpaVendorAdapter createJpaVendorAdapter() { // TODO Auto-generated method stub return null; } protected Map<String, Object> getVendorProperties() { // TODO Auto-generated method stub return null; } }
错误原因
- 织入配置冲突:已设置
eclipselink.weaving=static(静态织入),同时启用@EnableLoadTimeWeaving(运行时加载织入),两者功能重叠导致Spring无法正确创建LoadTimeWeaver bean。 - JPA配置类实现错误:继承
JpaBaseConfiguration后未正确重写核心方法,导致Spring自动配置逻辑失效。 - 手动创建Bean冲突:
JpaBaseConfiguration已自动处理EntityManagerFactory和TransactionManager的创建,手动定义会引发bean重复或初始化顺序错误。 - 插件路径错误:exec插件中javaagent使用相对路径,运行时无法定位到EclipseLink jar包。
解决方案
1. 修正JpaConfiguration类
移除@EnableLoadTimeWeaving注解,正确重写JpaBaseConfiguration的方法,交由Spring自动管理核心Bean:
package de.cibplus.cibplusngvdpGKZ; import java.util.Map; import java.util.HashMap; import javax.sql.DataSource; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter; import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter; import org.springframework.transaction.jta.JtaTransactionManager; @Configuration @EnableJpaAuditing public class JpaConfiguration extends JpaBaseConfiguration { public JpaConfiguration(DataSource dataSource, JpaProperties props, ObjectProvider<JtaTransactionManager> txm) { super(dataSource, props, txm); } @Override protected AbstractJpaVendorAdapter createJpaVendorAdapter() { EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter(); vendorAdapter.setGenerateDdl(false); return vendorAdapter; } @Override protected Map<String, Object> getVendorProperties() { Map<String, Object> properties = new HashMap<>(); // 启用静态织入,无需运行时加载织入 properties.put("eclipselink.weaving", "static"); return properties; } }
2. 调整pom.xml配置
- 添加
eclipselink.version属性统一版本管理; - 修正exec插件的javaagent路径,使用Maven仓库绝对路径:
<!-- 在properties节点添加 --> <properties> <java.version>11</java.version> <eclipselink.version>2.7.8</eclipselink.version> </properties> <!-- 修正exec插件配置 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <configuration> <executable>java</executable> <arguments> <argument>-Xmx1000m</argument> <!-- 使用Maven仓库中的EclipseLink jar作为javaagent --> <argument>-javaagent:${settings.localRepository}/org/eclipse/persistence/org.eclipse.persistence.jpa/${eclipselink.version}/org.eclipse.persistence.jpa-${eclipselink.version}.jar</argument> <argument>-classpath</argument> <classpath/> <!-- 替换为你的Spring Boot主类全限定名 --> <argument>de.cibplus.cibplusngvdpGKZ.CibplusNgVdpGkzApplication</argument> </arguments> </configuration> </plugin>
3. JSON数据处理配置(可选)
若需存储/读取JSON数据,可自定义EclipseLink转换器:
import javax.persistence.Converter; import org.eclipse.persistence.mappings.converters.Converter; import org.eclipse.persistence.sessions.Session; import com.fasterxml.jackson.databind.ObjectMapper; @Converter(autoApply = true) public class JsonConverter implements Converter { private static final long serialVersionUID = 1L; private final ObjectMapper objectMapper = new ObjectMapper(); @Override public Object convertObjectValueToDataValue(Object objectValue, Session session) { try { return objectValue != null ? objectMapper.writeValueAsString(objectValue) : null; } catch (Exception e) { throw new RuntimeException("对象转JSON失败", e); } } @Override public Object convertDataValueToObjectValue(Object dataValue, Session session) { try { return dataValue != null ? objectMapper.readValue((String) dataValue, Object.class) : null; } catch (Exception e) { throw new RuntimeException("JSON转对象失败", e); } } @Override public boolean isMutable() { return true; } }
在实体类的JSON字段上添加注解:
import javax.persistence.Column; import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class JsonEntity { @Id private Long id; @Column(columnDefinition = "VARCHAR(MAX)") @Convert(converter = JsonConverter.class) private Object jsonData; // getter和setter方法 }
验证启动
若使用动态织入,需通过exec插件启动项目;若使用静态织入,可移除exec插件的javaagent配置,确保编译时已完成织入。
内容的提问来源于stack exchange,提问作者Md101
相关产品推荐
相关产品推荐

