新手向:SpringBoot后端查询到数据,前端404?(附联调时各传参方式注解总结-带你一文搞定联调参数)

前言:

Spring Boot 项目开发中,后端小伙伴可能经常遇到这样诡异的场景:

  • 后台日志显示查询到了数据,但前端却一脸懵逼地告诉你 404 Not Found
  • 接口明明写好了,Postman 直接访问却提示找不到?
  • 调试半天,最后发现只是一个传参方式的问题?🙃

为什么会出现这种情况?是 后端接口定义的问题,还是 前端请求方式不对?或者是 Spring Boot 机制在悄悄“帮忙”,让空数据变成了 404?

这篇文章将带你 快速排查这个经典问题,并且 总结常见的 Spring Boot 传参方式及注解用法,助你在 联调时一次搞定参数对接,不再踩坑!🔥


复刻场景:请问你能找出问题吗?(答案在文末哦)

后端打印出查询结果但测试却是404?你能找出问题所在吗(注意这里不是端口的问题哦,作者配置的启动端口就是8888)

讲到这里了,作者就不妨来先讲讲各类注解在传参的时候的用法 


 传参注解的使用大全

 在 Spring Boot 开发中,前后端交互时,数据的传递方式有多种形式,主要包括 GET、POST、PUT、DELETE 等 HTTP 方法,以及 Query 参数、Path 变量、RequestBody、Header、Form 表单,对应的注解也有不同的用法。

🟢 1. Query 参数(@RequestParam)

适用场景:一般用于 GET 请求,将参数拼接在 URL 后面,如 ?key=value

示例

GET /user/getUserByName?name=Tom
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/getUserByName")
    public String getUserByName(@RequestParam String name) {
        return "查询用户:" + name;
    }

    // @RequestParam 可以提供默认值和非必传参数
    @GetMapping("/getUserByAge")
    public String getUserByAge(@RequestParam(required = false, defaultValue = "18") int age) {
        return "用户年龄:" + age;
    }
}

特点

  • 适用于 简单参数传递,如 ?key=value 形式
  • 可以设置 required = false 使参数可选
  • 可以设置 defaultValue 以提供默认值

🔵 2. Path 变量(@PathVariable)

适用场景:用于 RESTful 风格 API,参数作为 URL 路径的一部分,如 /user/1001

示例

前端请求

GET /user/1001
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/{id}")
    public String getUserById(@PathVariable("id") Long id) {
        return "查询用户 ID:" + id;
    }
}

特点

  • 适用于 RESTful 结构,更加语义化
  • 需要在 @GetMapping("/{id}") 的路径中声明参数
  • @PathVariable("id") 可以省略 ("id"),但建议保持一致,增强可读性

🟠 3. RequestBody 方式(@RequestBody)

适用场景:用于 POST/PUT 请求,前端传递 JSON 格式的数据,适合 复杂对象

示例

前端请求(JSON-前后端交互的一种数据格式)

{
    "id": 1001,
    "name": "Tom",
    "age": 25
}
@RestController
@RequestMapping("/user")
public class UserController {

    @PostMapping("/add")
    public String addUser(@RequestBody User user) {
        return "添加用户:" + user.getName();
    }
}

特点

  • 适用于 复杂数据传输(JSON)
  • 需要 @RequestBody 注解将 JSON 解析为Java对象
  • 默认情况下,Spring Boot 需要使用 @RequestBody 来解析 JSON 数据,否则会报 415 错误(Unsupported Media Type)
  • 需要前端设置 Content-Type: application/json

🟣 4. Form 表单数据(@RequestParam 或 @ModelAttribute)

适用场景:前端以 x-www-form-urlencoded 形式提交数据

示例

前端请求

POST /user/register
Content-Type: application/x-www-form-urlencoded

name=Tom&age=25
@PostMapping("/register")
public String registerUser(@RequestParam String name, @RequestParam int age) {
    return "注册用户:" + name + ",年龄:" + age;
}

 或者使用 @ModelAttribute,支持对象自动封装:

@PostMapping("/registerUser")
public String registerUser(@ModelAttribute User user) {
    return "注册用户:" + user.getName() + ",年龄:" + user.getAge();
}

特点

  • 适用于 表单提交
  • @RequestParam 适合单个参数,@ModelAttribute 适合对象
  • 前端需使用 application/x-www-form-urlencoded

🟡 5. Header 方式(@RequestHeader)

适用场景:用于 传递 Token、API Key、User-Agent 等请求头信息

示例

前端请求

GET /user/info
Authorization: Bearer abc123
@GetMapping("/info")
public String getUserInfo(@RequestHeader("Authorization") String token) {
    return "获取用户信息,Token:" + token;
}

特点

  • 适用于 认证信息、请求头参数
  • @RequestHeader 用于获取指定请求头的值

🟠 6. 多参数组合(混合使用-少见)

有时候,我们需要同时接收 路径参数 + Query 参数 + Body 参数,可以 混合使用 多种方式:

@PostMapping("/update/{id}")
public String updateUser(
    @PathVariable("id") Long id,
    @RequestParam("role") String role,
    @RequestBody User user
) {
    return "更新用户 ID:" + id + ",角色:" + role + ",姓名:" + user.getName();
}

 示例请求

POST /user/update/1001?role=admin
Content-Type: application/json

{
    "name": "Tom",
    "age": 26
}

总结

参数类型方式适用场景主要注解
Query 参数?name=TomGET 请求参数@RequestParam
Path 变量/user/1001RESTful 风格@PathVariable
JSON 请求体{"name":"Tom","age":25}POST/PUT 请求@RequestBody
表单提交name=Tom&age=25POST 表单提交@RequestParam / @ModelAttribute
请求头Authorization: Bearer token123传递 Token / API Key@RequestHeader

 

传参时各类可能会出现问题的解决方案(如果出现了问题,请从下面的几个思路逐步检查!!

1. 接口 URL 配置错误

/user/findbyid

检查你的 Controller 是否正确定义了路径。例如:

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/findById")
    public User findById(@RequestParam Long id) {
        // 这里是正常的查询逻辑
        return userService.getById(id);
    }
}

可能的问题

  • 大小写敏感:你的请求路径是 /user/findbyid,但方法是 @GetMapping("/findById")F 大写,B 大写,URL 访问是大小写敏感的,应该确保前端请求路径与后端路径完全一致。
  • 路径拼写错误:检查是否手误拼错,比如 /findbyid vs /findById
  • 浏览器缓存问题:如果之前请求 404,可能是缓存问题,清理浏览器缓存或使用 Postman、cURL 重新测试。(这个着重注意:edge浏览器有时会出现这个问题!记得点开历史记录清除缓存)

解决方案 试试访问:

http://localhost:8080/user/findById?id=1

2. HTTP 方法错误

你的接口是 @GetMapping("/findById"),但如果前端用的是 POST 请求,那么就会返回 404 Not Found

检查前端请求方式

GET /user/findbyid?id=1

如果前端使用了 POST,但后端是 @GetMapping,就会导致 405

解决方案

  • 如果前端要用 POST,后端应该改为
@PostMapping("/findById")
public User findById(@RequestParam Long id) {
    return userService.getById(id);
}
  • 如果后端是 @GetMapping,前端应该用 GET 请求。

3. 方法返回值不符合 REST 规范

如果你的 findById 方法返回的是 null,Spring Boot 可能会返回 404 Not Found,而不是 null 值。

检查你的返回值

@GetMapping("/findById")
public User findById(@RequestParam Long id) {
    User user = userService.getById(id);
    System.out.println("查询到的用户:" + user);
    return user;  // 如果 user 是 null,Spring Boot 可能会返回 404
}

解决方案

如果希望即使数据为空也返回 200 而不是 404,可以这样:

@GetMapping("/findById")
public ResponseEntity<?> findById(@RequestParam Long id) {
    User user = userService.getById(id);
    if (user == null) {
        return ResponseEntity.ok("用户不存在");
    }
    return ResponseEntity.ok(user);
}

4. 返回数据未被 Spring Boot 识别

Spring Boot 需要 @RestController@ResponseBody 才能正确返回 JSON。

@Controller  // ❌ 可能只是普通 Controller,而非 REST
@RequestMapping("/user")
public class UserController {

    @GetMapping("/findById")
    public User findById(@RequestParam Long id) {
        return userService.getById(id);
    }
}

如果没有 @ResponseBody,Spring 可能会尝试解析为视图,而不是 JSON。

解决方案

  • 确保使用 @RestController(等价于 @Controller + @ResponseBody
@RestController
@RequestMapping("/user")
public class UserController {

如果必须使用 @Controller,那么应该添加 @ResponseBody

@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/findById")
    @ResponseBody
    public User findById(@RequestParam Long id) {
        return userService.getById(id);
    }
}

5. 路由冲突或 Spring Boot 过滤器拦截

Spring Boot 可能有 全局拦截器、过滤器,或者其他 Controller 处理了相同路径的请求,导致你的请求被拦截或返回 404

解决方案

  1. 检查 application.properties 是否有拦截器

     2.查看是否有 ControllerAdvice 处理全局异常

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<String> handleNotFound() {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("接口不存在");
    }
}

6. Spring Boot 404 相关全局配置

application.properties 中,检查是否配置了:

server.error.include-message=always
server.error.whitelabel.enabled=false

如果 whitelabel.enabled=true 可能会导致 Spring 自定义错误页面返回 404

🛠 总结 & 解决方案

可能原因解决方案
大小写敏感/findById/findbyid,保持大小写一致
HTTP 方法错误@GetMapping("/findById") 不能用 POST 访问
返回 null 导致 404使用 ResponseEntity.ok() 处理
缺少 @RestController使用 @RestController@ResponseBody
路由冲突确保 /user/findById 不是被其他 Controller 拦截
拦截器或过滤器检查 application.propertiesControllerAdvice

 你找到第一部分的bug所在之处了吗?(解答)

答对发在评论区的小伙伴有奖励哦----正确答案就是在解决问题的第四步方案!你发现了吗?-我们只需要把@Controller注解改成@RestController即可

因为我们返回的是一个UserVO对象,复杂类型要解析成json数据给前端交互,如果只用@Controller则会解析为视图对象,但是在前后端分离的项目中基本不用它

修复结果如下:


最后的话:查 Bug 有套路,调接口不迷路!🚀

如果你看到这里,相信你已经对 Spring Boot 接口 404 问题 有了更清晰的认识,同时也掌握了 各种参数传递方式及注解用法

开发过程中,前后端联调 总会遇到各种坑,但只要掌握排查思路,就能快速定位问题,精准修复 Bug!💪

如果这篇文章对你有帮助,记得点赞 👍、收藏 ⭐、分享 📢,让更多小伙伴少踩坑!也欢迎关注我,后续会持续分享更多 Spring Boot 开发技巧、Bug 查杀指南和最佳实践,让我们一起进步!🚀🔥

👇 你遇到过哪些诡异的接口问题?欢迎评论区交流! 💬

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/972728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全重点总结

第一章 网络安全基础 信息安全的三个目标 1.保密性 2. 完整性 3. 可用性 4. 合法使用网络安全的发展态势&#xff1a; 1. 计算机病毒层出不穷 2. 黑客对全球网络的恶意攻击石头逐年上升 3. 由于技术不完备&#xff0c;导致系统催在缺陷&#xff0c;漏洞 4. 世界各国军方在加紧…

电解电容的参数指标

容量 这个值通常是室温25℃&#xff0c;在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压&#xff0c;通常要求降额使用。 例如额定电压是4V&#xff0c;降额到70%使用&#xff0c;最高施…

百问网(100ask)的IMX6ULL开发板的以太网控制器(MAC)与物理层(PHY)芯片(LAN8720A)连接的原理图分析(包含各引脚说明以及工作原理)

前言 本博文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 。 本博文和博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 的目录是找出百问网(100ask)的IMX6ULL开发板与NXP官方提供的公板MCIMX6ULL-EVK(imx6ull14x14evk)在以太网硬件…

python入门笔记4

Python 中的列表&#xff08;List&#xff09;是 有序、可变 的序列类型&#xff0c;用方括号 [] 定义。以下是列表的核心语法和常用操作&#xff1a; list1 [Google, W3Cschool, 1997, 2000] list2 [7, 2, 3, 4, 5, 6, 1 ] #索引操作 print ("list1 first: ", li…

玩转SpringCloud Stream

背景及痛点 现如今消息中间件(MQ)在互联网项目中被广泛的应用&#xff0c;特别是大数据行业应用的特别的多&#xff0c;现在市面上也流行这多个消息中间件框架&#xff0c;比如ActiveMQ、RabbitMQ、RocketMQ、Kafka等&#xff0c;这些消息中间件各有各的优劣&#xff0c;但是想…

Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)

文章目录 Redis下载地址&#xff1a;一、zip压缩包方式下载安装 1、下载Redis压缩包2、解压到文件夹3、启动Redis服务4、打开Redis客户端进行连接5、使用一些基础操作来测试 二、msi安装包方式下载安装 1、下载Redis安装包2、进行安装3、进行配置4、启动服务5、测试能否正常工…

SOME/IP--协议英文原文讲解9

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.1.4 T…

容器网络(三)- calico网络IPIP模式

一、前置知识 calico的IPIP模式使用到了tun设备&#xff0c;先来了解下什么是tun设备&#xff0c;它的作用是什么&#xff0c;以及使用到tun设备的IPIP隧道是如何工作的。 1.1 tun设备 tun是网络层的虚拟网络设备&#xff0c;可以收发第三层数据报文包&#xff0c;如IP封包&…

网络原理-HTTP/HTTPS

文章目录 HTTPHTTP 是什么&#xff1f;理解“应用层协议”理解 HTTP 协议的⼯作过程HTTP 协议格式抓包⼯具的使用抓包⼯具的原理抓包结果协议格式总结 HTTP 请求&#xff08;Request&#xff09;认识 URLURL 的基本格式关于URL encode 认识“⽅法”&#xff08;method&#xff…

sentinel集成nacos做持久化配置

sentinel提供了非常强大的控制台来提供流控等功能&#xff0c;但是控制台只是临时的配置&#xff0c;想要将流控配置永久的保存&#xff0c;或者在项目启动的时候就加载&#xff0c;不需要手动设置&#xff0c;就需要使用到nacos与sentinel做集成配置。这里都是不变代码&#x…

网络安全技术pat实验 网络安全 实验

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 网络安全实验3 前言Kali 常用指令工具教程 ettercap 基本使用 一、口令破解 John the ripper 破解 linux 密码l0phtcrack7 破解 windows 密码John 破解 zip 压…

大模型工具大比拼:SGLang、Ollama、VLLM、LLaMA.cpp 如何选择?

简介&#xff1a;在人工智能飞速发展的今天&#xff0c;大模型已经成为推动技术革新的核心力量。无论是智能客服、内容创作&#xff0c;还是科研辅助、代码生成&#xff0c;大模型的身影无处不在。然而&#xff0c;面对市场上琳琅满目的工具&#xff0c;如何挑选最适合自己的那…

个人简历html网页模板,科技感炫酷html简历模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…

解决 Mac 只显示文件大小,不显示目录大小

前言 在使用 mac 的时候总是只显示文件的大小&#xff0c;不显示文件夹的大小&#xff0c;为了解决问题可以开启“计算文件夹”。 步骤 1.进入访达 2.工具栏点击“显示”选项&#xff0c;点击 “查看显示选项” 3.勾选 显示“资源库"文件夹 和 计算所有大小 或者点击…

UE5.3 C++ 通过Spline样条实现三维连线,自己UV贴图。

一.制作了基于USplineComponent的画线插件&#xff0c;就是我们常说的样条线。 直接看怎么用&#xff0c;关于插件实现细节&#xff0c;后续会更新&#xff0c;看思路就行。通过ID,管理每一条线。移除删掉上一帧的线条Mesh。第一个点&#xff0c;是本身直接放过去。第二个点是…

[qt5学习笔记]Application Example示例程序源码解析

开发环境问题 vs2022下直接打开ui、ts文件失败 解决办法如下图&#xff0c; 设置designer独立运行。估计是嵌入运行存在些许bug。 同理&#xff0c;ts编辑工具linguist也存在这个问题。 qrc rc的编辑嵌入编辑都正常&#xff0c;但分离式更稳定可靠。 qt creator编译失败 原…

Ubuntu 系统 LVM 逻辑卷扩容教程

Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中&#xff0c;LVM&#xff08;Logical Volume Manager&#xff09;是一种逻辑卷管理工具&#xff0c;允许管理员动态调整磁盘空间&#xff0c;而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷&#xff0c;以实现…

Javascript网页设计实例:通过JS实现上传Markdown转化为脑图并下载脑图

功能预览 深度与密度测试 对于测试部分&#xff0c;分别对深度和密度进行了测试&#xff1a; 注意&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;只实现了识别Markdown中的#代表的层级&#xff0c;所以不能使用其余标识符&#xff0…

什么是tomcat

什么是tomcat Tomcat 是由Apache软件基金会开发的一个开源的轻量级Web服务器&#xff0c;主要用于部署和运行Java Servlet和JavaServer Pages (JSP) 技术构建的Web应用。以下是关于Tomcat的一些关键点&#xff1a; Java Web应用容器&#xff1a;Tomcat作为Servlet容器&#x…

一.AI大模型开发-初识机器学习

机器学习基本概念 前言 本文主要介绍了深度学习基础&#xff0c;包括机器学习、深度学习的概念&#xff0c;机器学习的两种典型任务分类任务和回归任务&#xff0c;机器学习中的基础名词解释以及模型训练的基本流程等。 一.认识机器学习 1.人工智能和机器学习 人工智能&am…