SpringBoot+MySQL API建表成功但CRUD操作报404错误求助
SpringBoot API 404错误排查
我用SpringBoot+Maven开发Java API,按教程配置后成功在MySQL创建了数据表,但访问localhost:8080/prodotti或执行CRUD操作时返回404错误。以下是相关代码、配置及日志信息:
控制器代码
@RestController @RequestMapping("/prodotti") public class ControllerProdotti { ServizioProdotti servizioProdotti; public ControllerProdotti(ServizioProdotti servizioProdotti) { this.servizioProdotti = servizioProdotti; } // 根据ID查询商品 @GetMapping("/{id}") public Prodotti getDettagliProdotti(@PathVariable("id") Integer idProdotti) { return servizioProdotti.getProdotti(idProdotti); } // 查询所有商品 @GetMapping("/") public java.util.List<Prodotti> getAllProdotti() { return servizioProdotti.getAllProdotti(); } @PostMapping("/") public String createDettagliProdotti(@RequestBody Prodotti prodotti) { servizioProdotti.creaProdotto(prodotti); return "商品创建成功!"; } @PutMapping("/") public String updateDettagliProdotti(@RequestBody Prodotti prodotti) { servizioProdotti.aggiornaProdotto(prodotti); return "商品更新成功!"; } @DeleteMapping("{id}") public String deleteDettagliProdotti(@PathVariable("id") Integer idProdotti) { servizioProdotti.cancellaProdotto(idProdotti); return "商品删除成功!"; }
仓库代码
public interface repositoryProdotti extends JpaRepository<Prodotti, Integer> {}
服务接口
public interface ServizioProdotti { String creaProdotto(Prodotti prodotti); String aggiornaProdotto(Prodotti prodotti); String cancellaProdotto(Integer idProdotti); Prodotti getProdotti(Integer idProdotti); List<Prodotti> getAllProdotti(); }
服务实现类
@Service public class ImplementazioneProdotti implements ServizioProdotti{ repositoryProdotti RepositoryProdotti; public ImplementazioneProdotti(repositoryProdotti RepositoryProdotti) { this.RepositoryProdotti = RepositoryProdotti; } @Override public String creaProdotto(Prodotti prodotti) { // 其他业务逻辑 RepositoryProdotti.save(prodotti); return "创建成功!"; } @Override public String aggiornaProdotto(Prodotti prodotti) { RepositoryProdotti.save(prodotti); return "更新成功!"; } @Override public String cancellaProdotto(Integer idProdotti) { RepositoryProdotti.deleteById(idProdotti); return "删除成功!"; } @Override public Prodotti getProdotti(Integer idProdotti) { return RepositoryProdotti.findById(idProdotti).get(); } @Override public List<Prodotti> getAllProdotti() { return RepositoryProdotti.findAll(); } }
配置文件(application.properties)
# =============================== # = 数据源配置 # =============================== # 数据库"mercatoPro"的连接地址 spring.datasource.url = jdbc:mysql://localhost:3306/mercatoPro?useSSL=false # 用户名和密码 spring.datasource.username = root spring.datasource.password = password # 长时间空闲时保持连接活跃(生产环境需要) spring.datasource.testWhileIdle = true spring.datasource.validationQuery = SELECT 1 # =============================== # = JPA / HIBERNATE 配置 # =============================== # 是否打印SQL查询日志 spring.jpa.show-sql = true # Hibernate自动DDL模式:update表示根据实体类自动更新表结构 spring.jpa.hibernate.ddl-auto = update # 命名策略 spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy # 允许Hibernate为特定数据库生成优化的SQL #spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
启动日志
:: Spring Boot :: (v3.1.3) 2023-09-23T14:14:34.933+02:00 INFO 45877 --- [ restartedMain] c.mercatoPro.restAPI.RestApiApplication : 启动RestApiApplication,使用Java 20.0.2,PID为45877(由michy在/Users/michy/Downloads/restAPI目录启动) 2023-09-23T14:14:34.939+02:00 INFO 45877 --- [ restartedMain] c.mercatoPro.restAPI.RestApiApplication : 未设置活跃配置文件,使用默认配置文件:"default" 2023-09-23T14:14:35.043+02:00 INFO 45877 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools属性默认启用!设置'spring.devtools.add-properties'为'false'可禁用 2023-09-23T14:14:35.044+02:00 INFO 45877 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : 如需更多Web相关日志,可将'logging.level.web'设置为'DEBUG' 2023-09-23T14:14:36.252+02:00 INFO 45877 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : 以DEFAULT模式启动Spring Data JPA仓库 2023-09-23T14:14:36.308+02:00 INFO 45877 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Spring Data仓库扫描完成,耗时46ms,找到0个JPA仓库接口 2023-09-23T14:14:37.149+02:00 INFO 45877 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat初始化,端口:8080(http) 2023-09-23T14:14:37.162+02:00 INFO 45877 --- [ restartedMain] o.apache.catalina.core.StandardService : 启动服务[Tomcat] 2023-09-23T14:14:37.162+02:00 INFO 45877 --- [ restartedMain] o.apache.catalina.core.StandardEngine : 启动Servlet引擎:[Apache Tomcat/10.1.12] 2023-09-23T14:14:37.263+02:00 INFO 45877 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : 初始化Spring嵌入式WebApplicationContext 2023-09-23T14:14:37.265+02:00 INFO 45877 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : 根WebApplicationContext初始化完成,耗时2219ms 2023-09-23T14:14:37.445+02:00 INFO 45877 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: 处理PersistenceUnitInfo [name: default] 2023-09-23T14:14:37.519+02:00 INFO 45877 --- [ restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM核心版本6.2.7.Final 2023-09-23T14:14:37.521+02:00 INFO 45877 --- [ restartedMain] org.hibernate.cfg.Environment : HHH000406: 使用字节码反射优化器 2023-09-23T14:14:37.701+02:00 INFO 45877 --- [ restartedMain] o.h.b.i.BytecodeProviderInitiator : HHH000021: 字节码提供者名称:bytebuddy 2023-09-23T14:14:37.851+02:00 INFO 45877 --- [ restartedMain] o.s.o.j.p.SpringPersistenceUnitInfo : 未设置LoadTimeWeaver,忽略JPA类转换器 2023-09-23T14:14:37.868+02:00 INFO 45877 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 启动中... 2023-09-23T14:14:38.115+02:00 INFO 45877 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - 添加连接com.mysql.cj.jdbc.ConnectionImpl@5775c599 2023-09-23T14:14:38.117+02:00 INFO 45877 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 启动完成 2023-09-23T14:14:38.385+02:00 INFO 45877 --- [ restartedMain] o.h.b.i.BytecodeProviderInitiator : HHH000021: 字节码提供者名称:bytebuddy 2023-09-23T14:14:39.117+02:00 INFO 45877 --- [ restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: 使用JtaPlatform实现:[org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] Hibernate: alter table prodotti modify column prezzo float(23) not null 2023-09-23T14:14:39.206+02:00 INFO 45877 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : 初始化默认持久化单元的JPA EntityManagerFactory完成 2023-09-23T14:14:39.258+02:00 WARN 45877 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view默认启用,视图渲染期间可能会执行数据库查询。可显式配置spring.jpa.open-in-view为false关闭此警告 2023-09-23T14:14:39.670+02:00 INFO 45877 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload服务器运行在端口35729 2023-09-23T14:14:39.706+02:00 INFO 45877 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat启动完成,端口:8080(http),上下文路径为空 2023-09-23T14:14:39.718+02:00 INFO 45877 --- [ restartedMain] c.mercatoPro.restAPI.RestApiApplication : RestApiApplication启动完成,耗时5.395秒(进程已运行6.117秒)
请求报错截图

问题排查与解决方案
从日志关键信息Found 0 JPA repository interfaces可以看出,Spring未扫描到核心组件,导致接口无法映射返回404,具体修复步骤如下:
- 调整包扫描范围
SpringBoot默认只扫描启动类RestApiApplication所在包(c.mercatoPro.restAPI)及其子包的组件。如果控制器、仓库、服务类不在该范围内,需将它们移至对应包下,或在启动类添加扫描注解:
@SpringBootApplication @ComponentScan(basePackages = {"你的控制器包路径", "你的服务包路径"}) @EnableJpaRepositories(basePackages = {"你的仓库包路径"}) @EntityScan(basePackages = {"你的实体类包路径"}) public class RestApiApplication { public static void main(String[] args) { SpringApplication.run(RestApiApplication.class, args); } }
- 修正接口映射路径
控制器中@GetMapping("/")对应路径是/prodotti/(带末尾斜杠),而你访问的是/prodotti,可将方法上的路径注解改为无参数形式,兼容两种访问方式:
// 查询所有商品 @GetMapping public java.util.List<Prodotti> getAllProdotti() { return servizioProdotti.getAllProdotti(); }
同理,@PostMapping("/")、@PutMapping("/")也可改为@PostMapping、@PutMapping。
规范组件命名与注解
仓库接口repositoryProdotti不符合Java大驼峰命名规范,建议改为ProdottiRepository;虽然Spring Data JPA继承JpaRepository的接口会自动被识别,但确保无扫描范围问题的前提下,可添加@Repository注解增强可读性。检查依赖完整性
确认pom.xml中已引入Spring Web和Spring Data JPA核心依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> </dependencies>
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

