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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:45:54