记一次ViewResolver引起的问题 javax.servlet.ServletException: Could not resolve view with name

本文记录了一次由于ViewResolver引发的问题,问题出现在基于SpringBoot的项目中,表现为微信登录页面加载错误。解决过程中发现删除的springcloud依赖导致了问题,具体原因是freemarker的jar包缺失,影响了视图解析。通过分析源码,了解到当InternalResourceViewResolver无法解析特定视图时,会抛出异常。解决方案包括改用Spring内置的视图解析器。文章还涵盖了Spring初始化过程和ViewResolver的工作原理。
摘要由CSDN通过智能技术生成

记一次ViewResolver引起的问题

问题背景

公司的项目基于SpringBoot开发,基本上所有接口都是Restful风格的,接收json参数,返回json数据。一般控制类上直接用@RestController或者@Controller+@ResponseBody来将对象序列化后返回给前端。
项目中还有少数几个接口是通过redirect:xxx的方式进行重定向的,其中包括微信登录授权。这些接口需要用到Spring的ViewResolver实现类进行视图解析,得到viewName对应的View对象,然后由View对象进行视图的渲染(render)。

解决过程

  1. 早上10:30左右,测试人员反映微信公众号的登录页面加载错误,出现空白错误页面,页面显示Whitelabel Error Page

  2. 查看服务器日志,显示javax.servlet.ServletException: Could not resolve view with name 'redirect:https:

  3. 搜索该错误信息,查询到一堆博客等资料,都未能解决;

  4. 开始排查代码提交记录,发现pom.xml中删除了springcloud相关的5个依赖,添加依赖后,服务恢复正常。

查找原因

  1. 服务恢复后,开始查找springcloud导致该问题的原因,逐一排除springcloud的5个依赖,发现是spring-cloud-starter-hystrix-dashboard包中的spring-boot-stater-freemarkerjar包影响;
  2. 原服务中有该依赖和freemarker的jar包,服务可以正常进行redirect,排除了spring-cloud-starter-hystrix-dashboard后,freemarker的jar包不在classpath中,服务异常,不能进行redirect重定向;
  3. 开车查找FreeMarker的jar包在服务中的作用,单步调试到DispatcherServletrender(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)方法,发现:如果通过viewName无法解析到相应的View对象,则会抛出javax.servlet.ServletException: Could not resolve view with name异常,详见源码:
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
       //省略
       View view;
   	//如果使用 viewName 来关联一个View,则使用ViewResolve
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值