You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot REST API遭遇404错误及SQL表不存在异常的问题求助

Spring Boot REST API遭遇404错误及SQL表不存在异常的问题求助

我来帮你一步步排查和解决这两个问题,都是Spring Boot + JdbcTemplate开发中非常常见的小细节问题~


一、解决404 Not Found问题

你访问 GET http://localhost:8080/api/users 出现404的原因很直接:你的UserController类上标注了@RequestMapping("/api/users")作为基础路径,但类内部没有直接匹配这个基础路径根节点的GET请求处理方法

当前你的Controller里的有效GET端点是:

  • GET http://localhost:8080/api/users/hello:返回Hello World
  • GET http://localhost:8080/api/users/get:获取所有用户列表

两种解决方式:

  1. 添加根路径的GET处理方法(推荐,符合RESTful风格)
    UserController里新增一个无路径的@GetMapping,用来处理/api/users的GET请求:
@RestController
@RequestMapping("/api/users")
public class UserController {
    // ... 现有代码不变

    // 新增:处理/api/users的GET请求
    @GetMapping
    public List<User> getAllUsersRoot() {
        return service.getAllUsers();
    }
}

这样访问GET http://localhost:8080/api/users就能直接获取用户列表了。

  1. 使用现有正确的端点
    如果不想新增方法,就直接访问你已经定义好的GET http://localhost:8080/api/users/get来获取用户数据。

二、解决SQLSyntaxErrorException: 表'mydatabase.user'不存在的问题

这个问题的根源是SQL语句里的表名写错了

看你的UserRepository类的findAll()方法:

public List<User> findAll() {
    String sql = "SELECT * FROM user"; // 这里表名是user,但你的实际表名是users
    return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
}

而你其他CRUD方法(save、update、delete)里的SQL都正确使用了users作为表名,唯独查询列表的SQL写成了user,数据库里只有users表,所以会报“表不存在”的错误。

修复方法:

findAll()里的SQL语句修改为正确的表名users

public List<User> findAll() {
    String sql = "SELECT * FROM users";
    return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
}

额外的小建议

  1. 统一表名的引用方式:可以把表名定义成一个常量,避免手动写SQL时拼写错误,比如在UserRepository里加:
private static final String TABLE_NAME = "users";

然后所有SQL都用这个常量,比如String sql = "SELECT * FROM " + TABLE_NAME;

  1. 检查数据库连接配置:确保application.properties(或application.yml)里的数据库URL、用户名、密码正确,比如:
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

确认连接的确实是你的mydatabase库,避免连错库导致找不到表。

  1. RESTful风格优化:通常获取所有资源的端点用GET /api/users而不是/api/users/get,所以前面推荐的新增根路径GET方法更符合REST规范,这样API的可读性更好。

按照上面的修改,你的两个问题应该就能完全解决啦😉

火山引擎 最新活动