今天在一个项目使用springboot的spring mvc的时候遇到了一个问题:在controller中使用返回字符串redirect:/xxxx/xxx进行重定向失败,出现了无法解析redirect:/xxxx/xxx。
找了半天才发现视图解析器ViewResolver中没有添加InternalResourceViewResolver
项目里配置mvc配置类时继承了WebMvcConfigurationSupport,它默认会注册ViewResolverComposite和BeanNameViewResolver两个视图解析器
所以说我的项目没有注册InternalResourceViewResolver,只有InternalResourceViewResolver才能解析redirect:和forward:这些字符串的。
解决办法:
1、不继承WebMvcConfigurationSupport
2、在mvc配置类中注册入InternalResourceViewResolver
总结:在学习的过程中不要太死板,在我初学spring mvc是学到重定向直接返回字符串redirect:/xxx和转发返回字符串forward:/xxx,就习惯的认为这样是固定的。
所以说学习知识的原理比使用方法更重要。
补充:
springboot默认装配mvc使用的是WebMvcAutoConfiguration
WebMvcAutoConfiguration上有个注解 @ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
意思是WebMvcConfigurationSupport配置后不加载WebMvcAutoConfiguration
WebMvcAutoConfiguration默认注册:
-
InternalResourceViewResolver
-
BeanNameViewResolver 根据BeanName解析,自定义视图实现View接口的类注入IOC
-
ContentNegotiatingViewResolver
-
ViewResolverComposite
视图名称解析过程:
在返回视图时DispatcherServlet会 在resolveViewName方法中根据order属性循序遍历注册的视图解析器来解析返回的视图名称,如果有一个解析成功则返回