扫码阅读
手机扫码阅读

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

140 2024-11-06

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:Spring Boot 中这个默认视图名有点意思,看懂直呼内行内行!
文章来源:
江南一点雨
扫码关注公众号
Spring Boot 返回JSON错误分析摘要

Spring Boot 返回JSON错误分析摘要

松哥分享了关于Spring Boot项目中返回JSON时出现的错误分析。错误产生是因为忘记添加@ResponseBody注解,导致使用不同的视图解析器会出现不同的错误。例如使用Freemarker会报循环调用错误,而Thymeleaf则会提示视图不存在的错误。

1.方法入口

在doDispatch方法中,如果接口方法没有使用@ResponseBody注解,则返回的ModelAndView对象没有视图。这时Spring MVC会调用applyDefaultViewName方法给出一个默认视图名。

2.applyDefaultViewName

applyDefaultViewName方法会检查ModelAndView对象是否为null以及是否包含视图,如果不包含,则调用getDefaultViewName方法获取并设置默认视图名。

3.getDefaultViewName

getDefaultViewName方法通过RequestToViewNameTranslator接口获取默认视图名。一般情况下,默认视图名是请求路径。

4.问题分析

视图解析器的理解对于分析这个问题至关重要。ContentNegotiatingViewResolver作为主要的视图解析器会选择合适的View。

4.1 Freemarker

当使用Freemarker时,由于不存在命名为请求路径的视图,会导致FreeMarkerViewResolver返回null,进而InternalResourceViewResolver处理请求并抛出循环调用错误。

4.2 Thymeleaf

使用Thymeleaf时,如果模板不存在,AbstractTemplateResolver的resolveTemplate方法会返回null,导致TemplateManager抛出模板不存在的错误。

5.小结

松哥通过源码分析解释了在Spring MVC中没有写@ResponseBody注解时如何自动生成默认视图名,并且根据视图名查找视图的具体过程。最后提醒大家注意这一点以避免出错。

想要了解更多内容?

查看原文:Spring Boot 中这个默认视图名有点意思,看懂直呼内行内行!
文章来源:
江南一点雨
扫码关注公众号