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

Spring Boot CRUD应用启动报错:Unsatisfied dependency及NoSuchMethodError

解决你的Spring Boot CRUD应用启动报错问题

Hey Stanly, let's break down what's going wrong here and fix it step by step!

核心错误根源

你看到的java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization()是JPA版本冲突导致的。这个方法是JPA 2.1才引入的,如果你的项目里同时存在旧版本的JPA API(比如JPA 2.0)和依赖JPA 2.1的Spring/Hibernate组件,就会出现这个方法找不到的错误。

分步解决方案

1. 统一依赖版本(优先用Spring Boot Starter)

如果你用的是Spring Boot,一定要用它的starter依赖来管理JPA相关组件,避免手动引入导致的版本冲突。确保你的pom.xml(Maven)或build.gradle里包含:

<!-- Maven示例 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

同时删除任何手动引入的javax.persistence:persistence-api或者旧版本的Hibernate依赖,让Spring Boot自动维护兼容的版本。

2. 修正代码里的关键问题

你的代码里有几个小错误,也是导致Repository创建失败的原因:

  • 实体类缺少主键注解:JPA实体必须有@Id标注主键字段,否则Spring Data JPA无法识别实体的标识属性。
  • Repository接口名拼写错误:你定义的是ClientReposito,建议改成规范的ClientRepository,避免后续混淆。
  • 字段命名不规范:实体类里的Client字段首字母大写,不符合Java驼峰命名规范,建议改成client,避免ORM映射时的潜在问题。

修改后的实体类示例:

@Entity
// 如果数据库表名是demande,打开这个注解
// @Table(name = "demande")
public class ClientDao {
    @Id // 必须添加主键注解
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 可选,根据你的数据库主键生成策略调整
    @Column(name = "Id")
    private int id ;
    
    @Column(name = "groupe")
    private String groupe;
    
    @Column(name = "client") // 改成小写,和字段名一致
    private String client ;
    
    @Column(name = "quantite")
    private int quantite ;
    
    // getter和setter方法
}

修改后的Repository接口:

@Repository
public interface ClientRepository extends JpaRepository<ClientDao, Long> { }

对应的Service实现类也要同步修改注入的Repository名称:

@Service
public class ClientServiceImpli implements ClientService{
    @Autowired
    private ClientRepository clientRepository; // 这里也要改成正确的接口名
    
    @Transactional
    public void saveUser(ClientDao clientdao) {
        clientRepository.saveAndFlush(clientdao);
    }
}

3. 确认Spring包扫描范围

确保你的主Spring Boot应用类(带有@SpringBootApplication的类)所在的包是所有组件的父包,比如:

  • 主类在com.example.myapp
  • Repository在com.example.myapp.repository
  • 实体类在com.example.myapp.entity
  • Service在com.example.myapp.service
  • Controller在com.example.myapp.controller

如果你的组件分布在不同的包下,需要在主类上添加额外的扫描注解:

@SpringBootApplication
@EntityScan(basePackages = "com.example.myapp.entity") // 指定实体类所在包
@EnableJpaRepositories(basePackages = "com.example.myapp.repository") // 指定Repository所在包
public class MyAppApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyAppApplication.class, args);
    }
}

最后验证

做完以上修改后,清理项目的依赖缓存(Maven执行mvn clean install,Gradle执行clean build),然后重启STS,应该就能解决启动报错的问题了。

内容的提问来源于stack exchange,提问作者Stanly Medjo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:49:13