url找不到404的问题,url被拼接

今天遇到一个测试feign调用的功能,如图所示

先说结论 @Controller换成@RestController

将日志设置为debug模式

被DispatcherServlet FORWARD了

找到路径

对属性设置断点,看下是哪注进来的

我们再去找encodedPath

此处是undertow的源码,但是undertow只是一个服务器,因此,来源肯定不是这里,所以我们找spring的源码。

再来看getRequestDispatcher方法

url在此处做了个拼接,所以会出现404。原因是path没有带/,我们继续看这个path

String dispatcherPath = prepareForRendering(request, response);

java 复制代码
protected String prepareForRendering(HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		String path = getUrl();
		Assert.state(path != null, "'url' not set");

		if (this.preventDispatchLoop) {
			String uri = request.getRequestURI();
		if (path.startsWith("/") ? uri.equals(path) : uri.equals(StringUtils.applyRelativePath(uri, path))) {
				throw new ServletException("Circular view path [" + path + "]: would dispatch back " +
						"to the current handler URL [" + uri + "] again. Check your ViewResolver setup! " +
						"(Hint: This may be the result of an unspecified view, due to default view name generation.)");
				}
		}
		return path;
	}		

path是自身的url

在此处debug看属性看不到哪注入的,我们换个思路

这个类哪里来的

path来源

view = resolveViewName(viewName, mv.getModelInternal(), locale, request);

Spring MVC的ModelAndView获得的是view。

分析到此处,就可以知道,我们做前后端分离的时候,返回的并不是view。导致返回是view的原因@Controller。

@RestController是@Controller和@ReponseBody的结合体

@ReponseBody可以返回实体对象

相关推荐
熏鱼的小迷弟Liu38 分钟前
【Redis】Redis Zset实现原理:跳表+哈希表的精妙设计
数据库·redis·散列表
淋一遍下雨天1 小时前
Spark Streaming核心编程总结(四)
java·开发语言·数据库
zru_96022 小时前
Windows 安装 MongoDB 教程
数据库·mongodb
数据与后端架构提升之路2 小时前
深度解析如何将图像帧和音频片段特征高效存储到向量数据库 Milvus
数据库·opencv·音视频
20242817李臻3 小时前
李臻20242817_安全文件传输系统项目报告_第9周
数据库·安全
小白考证进阶中3 小时前
0基础可以考MySQL OCP么?备考时间需要多久?
数据库·mysql·开闭原则
观无3 小时前
Redis远程链接应用案例
数据库·redis·缓存·c#
星星点点洲3 小时前
【缓存与数据库结合方案】伪从技术 vs 直接同步/MQ方案的深度对比
数据库·缓存
努力奋斗的小杨3 小时前
学习MySQL的第十二天
数据库·笔记·学习·mysql·navicat
枫叶20004 小时前
OceanBase数据库-学习笔记1-概论
数据库·笔记·学习·oceanbase