You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:12:01