Spring Boot首个CRUD接口持续返回404错误求助
Spring Boot CRUD接口全部返回404排查方案
我用Spring Boot开发了第一个CRUD应用,但所有请求都返回404响应。已经检查过路径、URL和变量名称,Spring Boot启动无异常,数据库连接应该正常,但接口路径始终找不到。Postman请求URL为http://localhost:8888/users/getUser。
可能的原因及解决方法
1. 端口号不匹配
Spring Boot默认监听8080端口,你在Postman中用的是8888,但application.properties里只配置了数据库端口8889,未指定应用端口。
- 解决方案:要么在
application.properties添加server.port=8888,要么将Postman请求改为http://localhost:8080/users/getUser测试。
2. 组件扫描范围验证
虽然@SpringBootApplication默认扫描主类所在包(com.ignase.firstcrud)及其子包,你的Controller、Service、Repository都在子包内,理论上没问题,但可以显式指定扫描范围排除隐式问题:
@SpringBootApplication(scanBasePackages = "com.ignase.firstcrud")
3. Controller路径配置检查
确认UserController的路径注解无语法问题:
@RequestMapping(value = "/users")和@GetMapping(value = "/getUser")的字符串无多余空格或特殊字符,你的代码中看起来正常,但可以重新输入路径字符串避免编码问题。- 确认
@RestController注解正确引入(org.springframework.web.bind.annotation.RestController),你的代码已正确引入。
4. 数据库连接有效性确认
启动无异常不代表数据库连接成功,添加日志配置查看连接状态:
在application.properties中加入:
logging.level.org.springframework.jdbc=DEBUG
启动后查看日志,确认是否有数据库连接成功的日志信息。如果连接失败,可能导致JPA组件初始化异常,间接影响接口注册。
5. 修复Service层update方法bug(非404原因,但影响功能)
updateById方法修改用户属性后未调用save方法,修改不会持久化到数据库,修复后代码:
public UserModel updateById(UserModel request, Long id){ UserModel user = userRepository.findById(id).get(); user.setFirstName(request.getFirstName()); user.setLastName(request.getLastName()); user.setEmail(request.getEmail()); return userRepository.save(user); // 新增保存操作 }
代码清单
UserModel
package com.ignase.firstcrud.models; import jakarta.persistence.*; @Entity @Table(name = "user") public class UserModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String firstName; private String lastName; private String email; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
UserController
package com.ignase.firstcrud.controllers; import com.ignase.firstcrud.models.UserModel; import com.ignase.firstcrud.services.UserService; import jakarta.persistence.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Optional; @RestController @RequestMapping(value = "/users") public class UserController { @Autowired private UserService userService; @GetMapping(value = "/getUser") public ArrayList<UserModel> getUsers(){ return this.userService.getUsers(); } @PostMapping public UserModel saveUser(@RequestBody UserModel user){ return this.userService.saveUser(user); } @GetMapping(path = "/{id}") public Optional<UserModel> getUserById(@PathVariable ("id") Long id){ return this.userService.getById(id); } @PutMapping(path = "/{id}") public UserModel updateUserById(@RequestBody UserModel request, @PathVariable("id") Long id){ return this.userService.updateById(request, id); } @DeleteMapping(path = "/{id}") public String deleteById(@PathVariable("id") Long id){ boolean ok = this.userService.deleteUser(id); if (ok) return "user with id "+ id+ " deleted!"; else return "Error, user not deleted"; } }
UserRepository
package com.ignase.firstcrud.repositories; import com.ignase.firstcrud.models.UserModel; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface IUserRepository extends JpaRepository<UserModel, Long> { }
UserService
package com.ignase.firstcrud.services; import com.ignase.firstcrud.models.UserModel; import com.ignase.firstcrud.repositories.IUserRepository; import org.apache.catalina.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Optional; @Service public class UserService { @Autowired IUserRepository userRepository; public ArrayList<UserModel> getUsers(){ return (ArrayList<UserModel>) userRepository.findAll(); } public UserModel saveUser(UserModel user){ return userRepository.save(user); } public Optional<UserModel> getById(Long id){ return userRepository.findById(id); } public UserModel updateById(UserModel request, Long id){ UserModel user = userRepository.findById(id).get(); user.setFirstName(request.getFirstName()); user.setLastName(request.getLastName()); user.setEmail(request.getEmail()); return user; } public Boolean deleteUser(Long id){ try { userRepository.deleteById(id); return true; }catch (Exception e){ return false; } } }
FirstCrudApplication
package com.ignase.firstcrud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class FirstCrudApplication { public static void main(String[] args) { SpringApplication.run(FirstCrudApplication.class, args); } }
application.properties
spring.datasource.url=jdbc:mysql://localhost:8889/users spring.datasource.username=ignacio spring.datasource.password= spring.jpa.hibernate.ddl-auto=update
内容的提问来源于stack exchange,提问作者Ignacio A.S.
相关产品推荐
相关产品推荐

