Spring Boot 中这个默认视图名有点意思,看懂直呼内行内行!
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
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注解时如何自动生成默认视图名,并且根据视图名查找视图的具体过程。最后提醒大家注意这一点以避免出错。
想要了解更多内容?