【找不到视图问题解决】@RestController 与 @Controller注解的使用区别

news2024/9/20 18:28:02

一、问题描述

苍穹外卖在菜品分页查询功能实现的过程中,出现了找不到视图的情况

2024-07-12 21:54:20.860 ERROR 22488 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Could not resolve view with name 'admin/dish/page' in servlet with name 'dispatcherServlet'] with root cause

javax.servlet.ServletException: Could not resolve view with name 'admin/dish/page' in servlet with name 'dispatcherServlet'
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1383) ~[spring-webmvc-5.3.22.jar:5.3.22]
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1148) ~[spring-webmvc-5.3.22.jar:5.3.22]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087) ~[spring-webmvc-5.3.22.jar:5.3.22]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.22.jar:5.3.22]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.22.jar:5.3.22]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.22.jar:5.3.22]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.22.jar:5.3.22]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.22.jar:5.3.22]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.22.jar:5.3.22]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
	at java.base/java.lang.Thread.run(Thread.java:1623) ~[na:na]

原来的代码

@Controller
@RequestMapping("/admin/dish")
@Api(tags="菜品相关接口")
@Slf4j
public class DishController {

    @Autowired
    private DishService dishService;

    /**
     * 分页查询菜品
     */
     @GetMapping("/page")
     @ApiOperation("菜品分页查询")
     public Result<PageResult> page( DishPageQueryDTO dishPageQueryDTO){
         log.info("菜品分页查询:{}",dishPageQueryDTO);
         PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);
         return Result.success(pageResult);
     }
}

二、解决的措施

将注解@Controller 更换成 @RestController即可。控制器方法返回的请求体,但注解却需要直接解析的是视图,导致Spring MVC视图解析失败

具体原因我们得去思考以下这两个注解到底有什么的不同

@RestController 和 @Controller 是Spring框架中用于处理HTTP请求的注解,它们之间存在一些关键的区别,主要体现在它们对响应体的处理方式上。

@Controller

  • @Controller 注解用于标记在一个类上,表明这个类是一个Spring MVC Controller处理器。
  • 当处理器方法返回字符串时,它通常被解释为视图名(View Name),然后Spring MVC会尝试解析这个视图名并渲染相应的视图。当使用@Controller注解时,通常会结合JSP、Thymeleaf等模板引擎来渲染HTML页面。
  • @Controller注解的处理器方法可以直接返回视图名(String类型),也可以返回ModelAndView对象,后者包含了视图名和模型数据。
  • 如果需要返回JSON或XML等非HTML内容,则需要在处理器方法中使用@ResponseBody注解,或者将方法返回类型设置为ResponseEntityHttpEntity等,来指定响应体。


@RestController

  • @RestController@Controller@ResponseBody的组合注解。该类下的所有方法默认都会应用@ResponseBody注解。
  • 使用@RestController注解的控制器类,其方法默认返回的数据会直接写入HTTP响应体(Response Body)中,通常用于构建restful  Web服务。
  • 常见的返回类型包括ResponseEntityHttpEntityString(直接作为JSON或XML字符串返回)、以及任何可以被自动转换为JSON或XML的对象(Spring MVC通过消息转换器自动完成转换)。
  • 当你需要构建restful API时,@RestController是一个更合适的选择,因为它简化了代码,避免了在每个方法上都添加@ResponseBody注解。

使用@Controller时,通常用于返回视图名以渲染页面,适用于传统的Web应用。

使用@RestController时,通常用于构建restful API,返回的数据会直接作为响应体返回给客户端,适合前后端分离的应用场景。

三、猜测

所以我就在猜测,难道 菜品分页查询 这个功能需要用到 @ResponseBody这个注解么?不然为什么将@Controller 更换成 @RestController问题就迎刃而解了?于是我尝试修改代码如下:

果然解决了

所以@ResponseBody到底有什么用呢,再来探讨一下

@ResponseBody是Spring MVC中用于将控制器方法的返回值绑定到HTTP响应体上

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剖析 AI 对音乐的影响:创造还是毁灭之路

文章目录 &#x1f4d2;一、引言 &#x1f4d2;二、AI 降低音乐创作门槛 &#x1f680;&#xff08;一&#xff09;技术进步带来的便捷 &#x1f680;&#xff08;二&#xff09;对音乐普及的推动作用 &#x1f4d2;三、AI 重塑音乐创作流程 &#x1f680;&#xff08;一…

【多个Python版本存在,使用pip+不同版本安装库时,windows弹出打开方式窗口的解决方法】

问题描述 电脑上存在python3.9&#xff0c;3.10&#xff0c;3.11&#xff0c;安装顺序也是先安装3.9&#xff0c;然后3.10&#xff0c;最后3.11&#xff0c;那么直接使用pip安装&#xff0c;会装在3.11的位置&#xff0c;经过搜索可以通过pip版本&#xff0c;比如pip3.9 insta…

Java程序员转行大模型的机遇与挑战

随着人工智能技术的迅猛发展&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;正逐渐成为IT行业的热点。对于Java程序员来说&#xff0c;转行大模型领域不仅意味着新的机遇&#xff0c;也面临着诸多挑战。本文将探讨Java程序员转行大模型的机遇与挑战&am…

【系统架构设计师】十一、系统架构设计(层次架构风格|MVC|面向服务的架构风格|ESB)

目录 五、层次架构风格 5.1 两层C/S架构 5.2 三层C/S架构 5.3 三层B/S架构 5.4 MVC架构 5.5 MVP架构 5.6 MVVM架构 六、面向服务的架构风格 6.1 SOA特征 6.2 Web Service 6.2.1 关键技术 6.2.2 WEB Service 6.3 企业服务总线ESB 相关推荐 历年真题练习 五、层次…

PostgreSQL安装/卸载(CentOS、Windows)

说明&#xff1a;PostgreSQL与MySQL一样&#xff0c;是一款开源免费的数据库技术&#xff0c;官方口号&#xff1a;The World’s Most Advanced Open Source Relational Database.&#xff08;世界上最先进的开源关系数据库&#xff09;&#xff0c;本文介绍如何在Windows、Cen…

【c++11】什么情况下需要封装set/get

文章目录 一、平凡类型与非平凡类型什么时候使用set/get1.平凡类型2.非平凡类型 二、构造函数参数较多解决办法1.把所有参数放到一个结构体里面2.使用build设计模式 三、如果构造函数众多&#xff08;参数很多&#xff09;1.模仿make_unique&#xff0c;就地构造2.基于build设计…

【Typescript】Interface和type的区别;探讨为什么interface赋值给Record需要索引签名

一、Interface与type的区别 1、Interface可以声明合并&#xff0c;type不行 声明同名的类型&#xff0c;Interface同名会合并&#xff0c;而type重名会报错 2、类型扩展的方式不同 Interface基于extends继承扩展基类类型&#xff0c;而type利用 & 扩展 3、type可以被基础…

使用geoipupdate自动更新GeoIP数据库

一、 什么是 GeoIP&#xff1f; 通过在数据库中将地理位置和 IP 地址相互映射&#xff0c;软件程序便可以使用 IP 地址来确定其对应的地理位置&#xff0c;其中包括国家/地区、州/省、城市、邮政编码、纬度/经度、ISP、区号和其他信息。 很多软件都使用 MaxMind 的数据库对 IP…

Hive的基本操作(查询)

1、基础查询 基本语法 select 字段列表|表达式|子查询 from 表(子查询|视图|临时表|普通表) where [not] 条件A and|or 条件B --先&#xff1a;面向原始行进行筛选 group by 字段A[,字段B,...] > 分组【去重处理】 having 聚合条件(非原始字段条件) --再&#x…

超市管理系统 需求分析与设计 UML 方向

一、项目介绍 1.1项目背景 随着经济一体化和电子商务的迅速发展&#xff0c;网络传播信息的速度打破了传统信息传递的模式&#xff0c;互联网的高速发展和计算机应用在各个高校进展迅速&#xff0c;更多信息化产品的突飞猛进&#xff0c;让现代的管理模式也发生了巨大的变化&…

Catena-x标准解读:CX-0005 Item Relationship Service API 2.1.1 项目关系服务

1 介绍 如今&#xff0c;大量数据存储在一个行业供应链的不同参与者之间。通过将数据与其相关上下文连接起来&#xff0c;可以极大地提高数据的价值。 为了实现跨企业链接数据&#xff0c;应用了方面模型、标准化协议和连接数据的标准化方法等标准。Catena-X为访问跨企业链接…

Python学习:实现Python项目并学习如何进行(附70个项目源码)

实现Python项目并学习如何进行&#xff0c;是一个循序渐进的过程&#xff0c;涵盖了多个方面&#xff0c;包括基础知识的学习、技能的提升、项目的规划和实施等。以下是一个基本的指南&#xff0c;帮助你开始学习并实现Python项目&#xff1a; 1. 学习Python基础知识 语法与基…

Linux介绍以及常用命令

目录 1. 什么是Linux 2. Linux的种类 3. CentOS7 超详细的CentOS7.4下载与图文安装 4. 常用的网络适配器种类 5. 安装ssh客户端软件 6. CentOS7的目录结构 7. Linux常用命令详解 1.目录切换命令 -- cd 2. 查看目录下的内容 -- ls 3. 查看当前所在的目录 -- pwd 4. 创…

如何在gitee上创建远程仓库?

登录gitee网站后 填写自己的仓库信息后点击创建 然后来到一个新的界面可以看到自己的仓库地址 这样一个空白的仓库就建立好了 也可以按需选择初始化仓库

结合类型信息(1)——特征丰富的知识库补全网络

1 引言 1.1 问题 首先&#xff0c;隐式对应关系的问题。在联合嵌入模型中&#xff0c;知识库和文本数据之间的关系并不是直接给出的&#xff0c;而是需要通过实体在文本中的共现来推断。这意味着模型必须从上下文中学习实体之间的潜在关联&#xff0c;而不是基于显式的标签或…

利用css设计一套漩涡式网格(grid)布局

在Web开发中,CSS Grid布局系统为我们提供了前所未有的灵活性和控制力,使得创建复杂的二维布局变得轻而易举。今天,我们将探讨一种特殊的Grid布局——漩涡式布局,并通过一个具体的HTML和CSS示例来深入了解其实现方式。 漩涡式Grid布局概述 漩涡式Grid布局是一种视觉上呈现出…

【Linux】Ubuntu 漏洞扫描与修复的吃瘪经历

自从上次“劫持”事情后&#xff0c;项目经理将所有跟安全相关的都推给我了&#xff08;不算 KPI 又要被白嫖&#xff0c;烦死了&#xff09;。这次客户又提了一个服务器安全扫描和漏洞修复的“活”&#xff0c;我这边顺手将过程记录一下&#xff0c;就当经验总结跟各位分享一下…

一群追星星的人,对 AI 的盼与怕

面对 AI&#xff0c;有人害怕&#xff0c;有人期盼。 “AI 和画画的、开网约车的、写东西的人有仇吗&#xff1f;”近来成了很多从业者的心声。大模型技术驱动了 AI 的能力进化过临界点&#xff0c;我们普通人根本就跟不上&#xff0c;或快或慢被淘汰。看起来&#xff0c;AI 正…

[ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议&#xff08;VRISP 2024&#xff09;将于2024年8月2-4日在中国厦门召开。 VRISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供…

SpringBoot中动态注册Bean的方式

测试环境&#xff0c;本文源码 Java&#xff1a;8SpringBoot&#xff1a;2.5.14示例场景&#xff1a;动态注册ProxyServlet&#xff0c;间接实现类似于Nginx的反向代理功能 先理解如何实现动态注册 Bean 。 由于在 SpringBoot 中&#xff0c;先进行 Bean 的定义&#xff0c;…