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 WorldGET http://localhost:8080/api/users/get:获取所有用户列表
两种解决方式:
- 添加根路径的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就能直接获取用户列表了。
- 使用现有正确的端点
如果不想新增方法,就直接访问你已经定义好的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)); }
额外的小建议
- 统一表名的引用方式:可以把表名定义成一个常量,避免手动写SQL时拼写错误,比如在
UserRepository里加:
private static final String TABLE_NAME = "users";
然后所有SQL都用这个常量,比如String sql = "SELECT * FROM " + TABLE_NAME;
- 检查数据库连接配置:确保
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库,避免连错库导致找不到表。
- RESTful风格优化:通常获取所有资源的端点用
GET /api/users而不是/api/users/get,所以前面推荐的新增根路径GET方法更符合REST规范,这样API的可读性更好。
按照上面的修改,你的两个问题应该就能完全解决啦😉




