spring不进debug却反回了_SpringBoot可以进代码却返回404问题

SpringBoot可以进代码却返回404问题

问题核心

@RestController 与 @Controller 的区别。

从名字就能看出rest不是为了返回view而设计的,因此方法返回值类型会直接映射为http请求体,相反没有rest的是为了返回view,因此如果方法的返回值类型不能映射为一个view那么就会返回404,即使我们的代码已经进入controller中的方法开始执行。

因此,如果我们想让我们的方法直接映射为httpbody,那么使用 @RestController 或使用 @ResponseBody 标示方法返回值直接映射为body体。

简单来讲, @RestController = @Controller + @ResponseBody (which is for every method in the class.)

debug过程

我比较蠢,这么明显的问题,硬是卡了我几个小时…简单介绍下debug思路

上下文

某个场景需要发送一个将签名,随即串等信息的请求作为get的参数发送到配置的url中。作为服务端我们需要返回约定的内容,我们任务就是完成这个spi。

方案

确定可行的方案是,当网关服务器接收到请求后,我们将spi进行转发,到业务应用服务器中处理再返回。

问题出现

自测出现404,出现了网关的404和spring独特的404界面。这个时候还有nginx配置问题,解决了配置,再次调试,只出现spring的404。观察nginx日志可以发现网关侧没有问题,问题发生在应用侧,在应用服务器将到达的请求转发到localhost的springboot服务的时候,报了404

开始排查

最开始走了弯路,一直以为是nginx的配置问题,后来发现springboot日志代码正常执行但出口404,确定了是springboot的问题。

这里脑子懵了,看到业务日志正常打印就应该反应过来是spring的问题。这里在错误的思路上浪费了很多时间,反思原因还是因为对自己写的nginx配置没有信心和过于相信自己了解spring。

在应用服务器本地使用curl测试,更加确定是代码的问题。

在确定是spring的问题后,开始观察代码,发现了与平时不同的是,这次controller层没有用 @RestController ,想到可能是这里的差异,查了资料发现,果然是这个问题。下面是找到的解释:

@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面 查看原文

下面说一下为啥返回map或string对象时需要@ResponseBody注解:springmvc框架在接到返回值的时候,无论是map对象还是string对象,还是model或modelandview对象都会把它转换成view对象也就是视图对象返回,所以之前我的map对象就被当成一个视图返回了,从而造成404页面出现,这一过程可以通过打断点来查看详细步骤。查看原文

参考

[1] https://blog.csdn.net/dongkaiyong/article/details/80988058

[2] https://www.cnblogs.com/shuaifing/p/8119664.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值