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

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秒)

请求报错截图

Postman请求localhost:8080/prodotti返回404


问题排查与解决方案

从日志关键信息Found 0 JPA repository interfaces可以看出,Spring未扫描到核心组件,导致接口无法映射返回404,具体修复步骤如下:

  1. 调整包扫描范围
    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);
    }
}
  1. 修正接口映射路径
    控制器中@GetMapping("/")对应路径是/prodotti/(带末尾斜杠),而你访问的是/prodotti,可将方法上的路径注解改为无参数形式,兼容两种访问方式:
// 查询所有商品
@GetMapping
public java.util.List<Prodotti> getAllProdotti() {
    return servizioProdotti.getAllProdotti();
}

同理,@PostMapping("/")、@PutMapping("/")也可改为@PostMapping、@PutMapping。

  1. 规范组件命名与注解
    仓库接口repositoryProdotti不符合Java大驼峰命名规范,建议改为ProdottiRepository;虽然Spring Data JPA继承JpaRepository的接口会自动被识别,但确保无扫描范围问题的前提下,可添加@Repository注解增强可读性。

  2. 检查依赖完整性
    确认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:54:52