Spring Boot所有接口返回404问题排查求助
核心问题分析与修复步骤
1. 解决Spring Boot 3的JPA依赖兼容性问题
Spring Boot 3.x基于Jakarta EE 9+,不再支持javax.persistence包,必须使用jakarta.persistence。你的pom.xml中引入了javax.persistence-api:2.2,这会导致JPA注解失效,甚至干扰Spring组件扫描:
- 直接删除
javax.persistence-api依赖 spring-boot-starter-data-jpa已经包含了适配Jakarta EE的API,无需额外引入
2. 给实体类添加无参构造函数
Spring Data JPA要求实体类必须提供无参构造函数,否则无法通过反射实例化对象。在Odds类中补充无参构造:
public Odds() { // 供Spring反射实例化使用的无参构造 }
3. 修正包名拼写错误(若启用JPA仓库扫描)
注释掉的@EnableJpaRepositories注解中包名拼写错误:com.bookieburlgar.api.services(多了一个r),正确包名是com.bookieburglar.api.services。不过@SpringBootApplication已经默认扫描主类所在包下的Repository,所以可以不用手动添加该注解,除非Repository在其他包。
4. 移除冗余的@ComponentScan配置
@SpringBootApplication注解已经内置@ComponentScan,默认扫描主类(BookieBurglarApplication)所在包com.bookieburglar.api.services及其所有子包,手动添加的@ComponentScan(basePackages = "com.bookieburglar.api.services")属于冗余配置,删除后可避免潜在扫描冲突。
5. 确认访问路径正确性
OddsController的@RequestMapping("/Odds")搭配@GetMapping("/"),正确访问路径为:
http://localhost:8080/Odds/
注意路径中Odds首字母为大写,不要写成小写。
修复后的关键代码示例
修正后的主类
package com.bookieburglar.api.services; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class BookieBurglarApplication { public static void main(String[] args) { SpringApplication.run(BookieBurglarApplication.class, args); } }
修正后的Odds实体类(添加无参构造)
package com.bookieburglar.api.services.models; import java.util.List; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToMany; import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @Entity @JsonIgnoreProperties(ignoreUnknown = true) public class Odds { @Id @JsonProperty("id") private String id; @JsonProperty("sport_key") private String sport_key; @JsonProperty("sport_title") private String sport_title; @JsonProperty("commence_time") private String commence_time; @JsonProperty("home_team") private String home_team; @JsonProperty("away_team") private String away_team; @JsonProperty("bookmakers") @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "odds_id") private List<Bookmaker> bookmakers; // 新增无参构造函数 public Odds() {} public Odds(String id, String sportKey, String sportTitle, String commenceTime, String homeTeam, String awayTeam, List<Bookmaker> bookmakers) { this.id = id; this.sport_key = sportKey; this.sport_title = sportTitle; this.commence_time = commenceTime; this.home_team = homeTeam; this.away_team = awayTeam; this.bookmakers = bookmakers; } // 原有getter、setter方法保持不变 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSportKey() { return sport_key; } public void setSportKey(String sportKey) { this.sport_key = sportKey; } public String getSportTitle() { return sport_title; } public void setSportTitle(String sportTitle) { this.sport_title = sportTitle; } public String getCommenceTime() { return commence_time; } public void setCommenceTime(String commenceTime) { this.commence_time = commenceTime; } public String getHomeTeam() { return home_team; } public void setHomeTeam(String homeTeam) { this.home_team = homeTeam; } public String getAwayTeam() { return away_team; } public void setAwayTeam(String awayTeam) { this.away_team = awayTeam; } public List<Bookmaker> getBookmakers() { return bookmakers; } public void setBookmakers(List<Bookmaker> bookmakers) { this.bookmakers = bookmakers; } }
修正后的pom.xml(移除javax.persistence依赖)
<?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>3.0.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.bookieburglar.api</groupId> <artifactId>services</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Bookie Burglar</name> <description>API for BookieBurglar</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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> </plugin> </plugins> </build> </project>
验证步骤
- 清理Maven缓存并重新构建:
mvn clean install - 启动Spring Boot应用
- 访问
http://localhost:8080/Odds/,应返回WORLD - 访问
http://localhost:8080/Odds/refresh,应返回yoo
内容的提问来源于stack exchange,提问作者Blooish llc

