Spring Data创建ProjectRepository Bean失败:EntityPathResolver不能为空求助
问题描述
我是Spring新手,运行程序时出现BeanCreationException错误:创建repository.ProjectRepository对应的projectRepository Bean时初始化方法调用失败,嵌套异常为java.lang.IllegalArgumentException: EntityPathResolver must not be null!。我希望通过Spring Data实现H2数据库的读写操作,请求帮忙排查并修复问题。
报错日志
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'projectRepository' defined in repository.ProjectRepository defined in : Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: EntityPathResolver must not be null! at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:936) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85) at domain.Domain.main(Domain.java:23) Caused by: java.lang.IllegalArgumentException: EntityPathResolver must not be null! at org.springframework.util.Assert.notNull(Assert.java:201) at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.setEntityPathResolver(JpaRepositoryFactory.java:132) at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.createRepositoryFactory(JpaRepositoryFactoryBean.java:125) at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.doCreateRepositoryFactory(JpaRepositoryFactoryBean.java:116) at org.springframework.data.repository.core.support.TransactionalRepositoryFactoryBeanSupport.createRepositoryFactory(TransactionalRepositoryFactoryBeanSupport.java:80) at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:297) at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:144) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ... 12 more Process finished with exit code 1
相关代码与配置
Domain.java
package domain; import bl.HibernateUtil; import entity.Address; import entity.Employee; import entity.Project; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import repository.AddressRepository; import repository.EmployeeRepository; import repository.ProjectRepository; import service.AddressService; import service.EmployeeService; import service.ProjectService; import java.sql.Date; import java.sql.SQLException; import java.util.*; public class Domain { public static void main(String[] args) throws SQLException { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); AddressRepository addressRepository = context.getBean(AddressRepository.class); Address address = new Address(); address.setCountry("DC"); address.setCity("Gotham city"); address.setStreet("Arkham street 1"); address.setPostCode("12345"); Project project = new Project(); project.setTitle("Gotham PD"); Employee employee = new Employee(); employee.setFirstName("James"); employee.setLastName("Gordon"); Calendar calendar = Calendar.getInstance(); calendar.set(1939, Calendar.MAY, 1); employee.setBirthday(new Date(calendar.getTime().getTime())); employee.setAddress(address); Set<Employee> employees = new HashSet<Employee>(); employees.add(employee); project.setEmployees(employees); Set<Project> projects = new HashSet<Project>(); projects.add(project); employee.setProjects(projects); //addressRepository.save(address); System.out.println("***********"); // System.out.println(employeeRepository.findByFirstNameAndLastName("James","Gordon")); } }
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.vserdiuk.hibernate</groupId> <artifactId>hibernate-xml-mapping</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.13.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.6.13.Final</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.7.8</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api --> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.2.Final</version> </dependency> </project> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> </dependencies>
Address实体类
package entity; import javax.persistence.*; @Entity @Table(name = "ADDRESS") public class Address { @Id // @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "COUNTRY") private String country; @Column(name = "CITY") private String city; @Column(name = "STREET") private String street; @Column(name = "POST_CODE", length = 10) private String postCode; public Address() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getPostCode() { return postCode; } public void setPostCode(String postCode) { this.postCode = postCode; } @Override public String toString() { return "Address{" + "id=" + id + ", country='" + country + '\'' + ", city='" + city + '\'' + ", street='" + street + '\'' + ", postCode='" + postCode + '\'' + '}'; } }
AddressRepository代码
package repository; import entity.Address; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface AddressRepository extends JpaRepository<Address,Long> { }
解决方案
1. 修复pom.xml结构与依赖缺失
你的pom.xml存在语法错误:<project>标签提前闭合,导致jaxb-api依赖无法被识别;同时缺少Spring核心上下文、事务管理等必要依赖,这是引发EntityPathResolver为空的核心原因。修正后的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.vserdiuk.hibernate</groupId> <artifactId>hibernate-xml-mapping</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- H2数据库 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> <!-- Hibernate核心 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.13.Final</version> </dependency> <!-- Spring Data JPA --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.7.8</version> </dependency> <!-- Spring核心上下文 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.25</version> </dependency> <!-- Spring事务管理 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.25</version> </dependency> <!-- Spring ORM --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.25</version> </dependency> <!-- JAXB API --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> </dependencies> </project>
2. 修复Address实体类主键配置
Address实体中@Id字段被注释,导致JPA无法识别实体主键,影响Repository初始化。取消注释并配置主键生成策略:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
3. 完善Spring配置文件(applicationContext.xml)
缺少必要的Spring Data JPA配置,需添加数据源、EntityManagerFactory、事务管理器及Repository扫描配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 扫描实体类 --> <context:component-scan base-package="entity"/> <!-- 扫描Repository --> <jpa:repositories base-package="repository"/> <!-- H2数据源配置 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.h2.Driver"/> <property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean> <!-- EntityManagerFactory配置 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="entity"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true"/> <property name="generateDdl" value="true"/> <property name="database" value="H2"/> </bean> </property> </bean> <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!-- 开启事务注解支持 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
4. 确保Project实体类配置正确
报错指向ProjectRepository,需确保Project类添加@Entity注解,且有正确的@Id主键配置,结构与Address实体保持一致。
验证修复
完成修改后,重新编译运行程序,取消Domain.java中addressRepository.save(address)的注释,测试数据保存功能。
内容的提问来源于stack exchange,提问作者Vindener
相关产品推荐
相关产品推荐

