Spring Boot 中这个默认视图名有点意思,看懂直呼内行内行!

本文探讨了Spring Boot在缺少@ResponseBody注解时如何生成默认视图名,并导致不同的视图解析器(如Freemarker, Thymeleaf)产生不同错误。分析了DispatcherServlet的doDispatch方法、applyDefaultViewName过程,以及视图解析器如何处理默认视图名,解释了循环调用和模板不存在异常的原因。" 117839887,10318095,找出大型派对中的单身客人,"['算法', 'Python', '数据处理']
摘要由CSDN通过智能技术生成

今日分享开始啦,请大家多多指教~

在 Spring Boot 项目中,有的时候我们想返回一段 JSON,结果却忘了写 @ResponseBody 注解,像下面这样:

@Controller
public class HelloController {
    @GetMapping("/01")
    public void hello() {
        System.out.println("01");
    }
}

这个时候当项目跑起来,肯定会报错,具体报什么错,则要看用的什么视图解析器,如果用了 Freemarker,你可能会看到如下错误:在这里插入图片描述
这个错误是说陷入到循环调用中了。
如果用了 Thymeleaf,你可能会看到如下错误:在这里插入图片描述
这个是说一个名叫 01 的视图不存在。

我只是少加了一个 @ResponseBody 注解而已,为什么用不同的视图解析器会报不同的错误?并且这些错误实在看不出和 @ResponseBody 注解有什么关联。

1.方法入口

  • SpringMVC 源码分析之 DispatcherServlet

在这篇文章中,有一个小小细节,就是在 doDispatch 方法中,有如下一段代码:

applyDefaultViewName(processedRequest, mv);

当这段代码执行的时候,接口方法已经通过反射调用完成了,并且将返回值封装成了一个 ModelAndView 对象(如果接口方法用到了 @ResponseBody 注解,则此时拿到的 ModelAndView 对象为 null),但是这个时候的 ModelAndView 对象还没有渲染,此时会调用 applyDefaultViewName 方法去判断返回的 ModelAndView 对象中有没有 view,如果没有,则给出一个默认的视图名。

这行代码就是切入点,接下来我们就来分析一下 applyDefaultViewName 方法。

2.applyDefaultViewName

private void applyDefaultViewName(HttpServletRequest request, @Nullable ModelAndView mv) throws Exception {
 if (mv != null && !mv.hasView()) {
  String defaultViewName = getDefaultViewName(request);
  if (defaultViewName != null) {
   mv.setViewName(defaultViewName);
  }
 }
}

可以

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值