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可以返回实体对象

相关推荐
草莓熊Lotso几秒前
MySQL 数据类型核心指南:选型、实战与避坑
linux·运维·服务器·数据库·c++·人工智能·mysql
半个俗人几秒前
8.jmeter直连数据库-MySQL
数据库·jmeter
DolphinScheduler社区5 分钟前
Apache DolphinScheduler 3.4.1 发布,新增任务分发超时检测
java·数据库·开源·apache·海豚调度·大数据工作流调度
阿梦Anmory7 分钟前
快速部署Milvus 2.6.4单机版向量数据库(Docker Compose方式)
数据库·docker·milvus
小陳参上10 分钟前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
啥都想学点12 分钟前
pikachu靶场——SQL-Inject—3(Kali系统)
数据库·sql
惊讶的猫13 分钟前
influxdb(时序数据库)+mqtt(emqx+mqtt客户端)
数据库·时序数据库
珠海西格17 分钟前
红区之困:分布式光伏爆发背后的“逆流危机”
大数据·运维·服务器·数据库·人工智能·分布式
Volunteer Technology24 分钟前
Redis跟HashMap在结构上的区别
数据库·redis·缓存
林鸿群28 分钟前
批量提取游戏信息并插入数据库的自动化实践
数据库·游戏·自动化