【异常】记一次因注解@RestController没加(@RestController不会用),导致无法调用Controller层的方法

news/2024/4/25 20:59:08/文章来源:https://blog.csdn.net/wstever/article/details/129133279

一、背景

我想要调用一个Controller,定义的内容如下

@RequestMapping("/demo")
public class demoController {@GetMapping("/doSomething")public JSONObject doSomething() {JSONObject json = new JSONObject();json.set("title", "我是doSomething 的 title");json.set("content", "我是doSomething 的 content");return json;}
}

但是我得到了如下的结果
在这里插入图片描述
其中工程是基于SpringCloudAlibaba微服务搭建的,而问题代码是写在xxx-admin模块中,其中的路由/xxx为SpringCloud Gateway映射的网关路由,如下

#网关路由服务配置
spring:cloud:# 网关配置gateway:discovery:locator:lowerCaseServiceId: trueenabled: trueroutes:# 管理业务- id: xxx-adminuri: lb://xxx-adminpredicates:- Path=/xxx/**filters:- StripPrefix=1

那为什么会提示Not Found呢?不是路径都匹配了吗?哎,又被基础不扎实坑了一把!

二、问题解决

2.1 加一个@Controller注解

初步诊断,原因是没有定义到@Controller,Spring都不认识这个类,肯定不能找到啊
那就尝试加一个@Controller?于是编写了如下的代码

@Controller
@RequestMapping("/demo")
public class demoController {@GetMapping("/doSomething")public JSONObject doSomething() {JSONObject json = new JSONObject();json.set("title", "我是doSomething 的 title");json.set("content", "我是doSomething 的 content");return json;}
}

怎么还是提示未找到呢?奇怪~ 继续百度
在这里插入图片描述

2.2 加一个@Controller注解 + @ResponseBody注解

发现大家都会加上@ResponseBody注解,那我也加上试试
(典型的不理解背后原理盲目加注解)

于是改出了如下代码

@Controller
@RequestMapping("/demo")
public class demoController {@GetMapping("/doSomething")@ResponseBodypublic JSONObject doSomething() {JSONObject json = new JSONObject();json.set("title", "我是doSomething 的 title");json.set("content", "我是doSomething 的 content");return json;}
}

发现现在可以正常返回了。
在这里插入图片描述

2.3 加一个@RestController注解

那有没有更加优美的写法呢?答案肯定是有的!因为不涉及到页面跳转,因此可以直接@RestController,如果要求方法返回的是JSON格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注@ResponseBody,简化了开发过程。最终问题解决后的代码如下:

@RestController
@RequestMapping("/demo")
public class demoController {@GetMapping("/doSomething")public JSONObject doSomething() {JSONObject json = new JSONObject();json.set("title", "我是doSomething 的 title");json.set("content", "我是doSomething 的 content");return json;}
}

此时看到,也是可以正常返回响应结果了。
在这里插入图片描述

三、@RestController注解回顾

Spring 4.0引入了@RestController,这是一个控制器的专用版本,它是一个方便的注释。
在Spring中 , @RestController注解,相当于@ResponseBody@Controller
所以想要理解@RestController注解就要先了解@Controller@ResponseBody注解。

3.1 @Controller注解

@Controller注解是Spring框架中的一种注解,它的作用是用于标识控制器类、控制器组件、控制层组件,使其成为处理请求的组件,可以处理HTTP请求和其他种类的请求。

@Controller注解用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象,即在一个类上添加@Controller注解,表明了这个类是一个控制器类。控制器组件可以处理并响应应用程序中的用户请求,并将请求映射到适当的处理程序。

3.2 @RequestMapping注解

@Controller注解的类注入Spring容器中,只是该类成为处理器的第一步,
想要修炼大成,还需要在该类中添加注解@RequestMapping

分发处理器会扫描使用了使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解
可以把Request请求Header部分的值绑定到方法的参数上。

@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求
@RequestMapping注解既可以用在类上,也可以用在方法上。
当使用@RequestMapping标记控制器类时,方法的请求地址是相对类的请求地址而言的;
当没有使用@RequestMapping标记类时,方法的请求地址是绝对路径。

@RequestMapping的地址
可以是uri变量,并且通过@PathVariable注解获取作为方法的参数。
也可以是通配符来筛选请求地址。

什么时候用@ResponseBody注解 ?
如果想要方法直接返回结果,而不是跳转页面,这就要用到@ResponseBody注解了。

三、@ResponseBody注解

通过使用@RestController批注对控制器类进行注释,您不再需要将@ResponseBody添加到所有请求映射方法中。@ResponseBody注释默认处于活动状态。

异步请求,@ResponseBody注解表示方法的返回值直接以指定的格式写入Http Response Body中,而不是解析为跳转路径。格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。

@ResponseBody注解表用于将Controller中的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的Body数据区。

3.1 使用场景:

如果要求方法返回的是JSON格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注@ResponseBody,简化了开发过程。

即返回的数据内容,不是HTML标签的页面,而是其他某个格式的数据时(如JSON、XML等)使用。比如本文使用的就是返回JSON数据的场景。

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

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

相关文章

界面控件DevExpress WPF Pivot Grid——拥有强大多维数据分析能力!

界面控件DevExpress WPF的Pivot Grid组件是一个类似excel的数据透视表,用于多维数据分析和跨选项卡报表生成。它拥有众多的布局自定义选项,允许开发者完全控制其UI且以用户为中心的功能使其易于部署。PS:DevExpress WPF拥有120个控件和库&…

双因素方差分析全流程

上篇文章讲述了“单因素方差分析全流程总结”,单因素方差分析只是考虑了一个自变量(定类)与一个因变量(定量)之间的关系,但是在实际问题研究中可能研究两个或者几个因素与因变量之间的关系,例如…

核心技术: springboot 启动类加载时方法执行的几种实现方式, bean声明周期, 启动执行顺序

目录 1. 业务场景 -> 1.1 初始化操作 -> 1.2 业务操作 -> 1.3优势 2. 实现方式(多种方式,不同思想) -> 2.1 定时调度任务(常用四种方式 task ) --> 2.1.1 Timer(单线程) --> 2.1.2 scheduledExecutorService(多线程并发执行,线程池) --> 2.1…

linux部署zookeeper

linux部署zookeeper 1、单机部署zk ZooKeeper服务器是用Java创建的,它需要在JVM上运行,所以需要使用JDK1.6及以上版本,一般都是jdk1.8。 选择自己安装本地的jdk,而不是centos自带的openjdk。 查看本地安装的jdk: j…

【C++的OpenCV】第二课-CMake创建OpenCV项目

文章目录一、CMake是什么?1.1 基本概念1.2 CMake的优势二、使用Cmake构建一个OpenCV程序2.1 步骤(a)编写一个简单的OpenCV示例代码(b)创建一个Cmake文件(c)生成可执行文件(d&#xf…

DAX 微信 markdown 编辑器

DAX 微信 markdown 编辑器 一、致谢 感谢开源项目: md wechat-format 感谢 WordPress 插件 Mine云点播 作者 mine27 的指导。 二、如何使用 打开如下地址,直接编辑,可以实时看到符合微信公众号排版的效果。 推荐访问:https://j…

线上问题诊断指南

内容概要 诊断工具介绍工具可用情况偶现或已现问题诊断思路 硬件资源观测 top top可以看整个系统cpu、内存的使用情况,以及在各个进程上的情况,如下: $ top top - 13:14:07 up 2 days, 6:38, 0 users, load average: 1.65, 0.59, 0.27…

只因小黑子:SVG

小黑子的SVG复习SFV画布1. 初始SVG2. SVG绘制矩形、圆形和椭圆形2.1 rect 矩形2.2 circle 圆形2.3 ellipse 椭圆4. SVG绘制线条、多边形和多线条4.1 line 线条4.2 polygon 多边形4.3 polyline 多线条5. SVG绘制文本 text6. SVG绘制路径 path7. SVG描边属性8. SVG 模糊和阴影效果…

vue3.2中使用swiper缩略图轮播教程

介绍 在vue3 中使用 swiper 实现缩略图的轮播图效果,具体如下图所示: 使用 切换到项目终端 ,输入命令 npm install swiper --save , 进行安装在 main.js里,引入 swiper.css并使用,具体代码如下;import {createApp } from vue import App from ./App.vue import router…

查询服务器tns文件路径,oracle数据库tns配置方法详解

查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层, 监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。 TNS是Oracle Net…

Centos7搭建hadoop3.3.4分布式集群

文章目录1、背景2、集群规划2.1 hdfs集群规划2.2 yarn集群规划3、集群搭建步骤3.1 安装JDK3.2 修改主机名和host映射3.3 配置时间同步3.4 关闭防火墙3.5 配置ssh免密登录3.5.1 新建hadoop部署用户3.5.2 配置hadoopdeploy用户到任意一台机器都免密登录3.7 配置hadoop3.7.1 创建目…

linux shell脚本详解

一、!/bin/bash --- 指定脚本解释器 二、注释 1、单行注释 以 # 开头的行就是注释 2、多行注释 一般使用第一种!来注释 三、变量 只读变量 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 删除变量 unset variable_name…

社招中级前端笔试面试题总结

HTTP世界全览 互联网上绝大部分资源都使用 HTTP 协议传输;浏览器是 HTTP 协议里的请求方,即 User Agent;服务器是 HTTP 协议里的应答方,常用的有 Apache 和 Nginx;CDN 位于浏览器和服务器之间,主要起到缓存…

前端页面jquery规范写法

使用最新版本的 jQuery 最新版本的 jQuery 会改进性能和增加新功能,若不是为了兼容旧浏览器,建议使用最新版本的 jQuery。以下是三条常见的 jQuery 语句,版本越新,性能越好: $(.elem) $(.elem, context) context.find(.elem) 结果 1.6.2 版执行次数远超两个老版本。 jQ…

一文解决Rust字符串:String,str,String,str,CString,CStr

一、str和&str和String的区别 1.存放位置,可变不可变: str来源于Rust本身的数据类型,而String类型来自于标准库。首先看一下str 和 String之间的区别:String是一个可变的、堆上分配的UTF-8的字节缓冲区。而str是一个不可变的…

ElementUI分页的实现

官网地址&#xff1a;Element - The worlds most popular Vue UI framework 第一步&#xff1a;拷贝你喜欢的分页类型放在你的组件页面需要用到的分页位置 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-p…

记一次:request请求总结

前言&#xff1a;和前端联调的时候发现前端人员请求的方式不对&#xff0c;固做此总结问题&#xff1a;request请求方式有多少种&#xff1f;答&#xff1a;Java后端查看有8种&#xff0c;spring-web中的java枚举图如下而使用PostMan查看有15种&#xff0c;如下图GET&#xff0…

【重点掌握】Java基础之Javaweb核心技术详解

都说一入Java深似海&#xff0c;从此代码是爱人&#xff0c;但是学习的过程却从来都不轻松。当下&#xff0c;越来越多的互联网企业&#xff0c;招聘Java工程师时&#xff0c;明确写道需熟练掌握JavaWeb技术。作为衔接前后端的重要一环&#xff0c;JavaWeb技术已成为程序员向大…

火热报名 | DockQuery 1.2 beta版本体验官开启招募!

DockQuery是什么&#xff1f; DockQuery 代号「天狼」&#xff0c;是图尔兹全新自研的一款专业新型数据库桌面客户端&#xff0c;专为信创背景下国内外数据库开发/管理而设计&#xff0c;全面覆盖信创数据库目录、支持国内外操作系统。 目前&#xff0c;DockQuery 仅以社区版…

【教程】GitBook Editor编写电子书

GitBook Editor电子书编写说明1、安装软件2、创建文档3、编辑文档4、生成电子书1、安装软件 下载并安装GitBook Editor软件&#xff0c;网上资源很多&#xff0c;根据自己系统选用即可 官网参考&#xff1a;GitBook - Where technical teams document. 2、创建文档 1&#xf…