博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC同时使用<mvc:resources … />和装配自定义转换器Converter时出现问题的解决方法...
阅读量:6378 次
发布时间:2019-06-23

本文共 3024 字,大约阅读时间需要 10 分钟。

hot3.png

一、问题由来

在学习SpringMVC的过程中,对于URL的拦截,使用了RESTful形式,因为使用了RESTful所以,在将Servlet作为Controller中的时候,web.xml中配置拦截的url-pattern就写成了 / ,如下所示:

SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-mvc.xml
1
true
SpringMVC
/

如果配置成这样,对于静态资源(js,css等)也会被拦截,因为没有Controller处理器和其对应,很显然会报404的错误。

二、问题处理方式

对于此静态资源的问题,我采用了RT所示的<mvc:resources … />这种进行处理:

项目目录结构如下:

然而当把全局的Formatter<Date> 集成进去,想将字符串转成Date的转换器配置进处理器适配器时候出现问题,此时对于SpringMVC的配置是:

错误提示主要是:

org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.util.ArrayList<?>] to type [java.util.List<org.springframework.core.io.Resource>] for value '[/WEB-INF/statics/js/]'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.util.ArrayList<?>] to type [org.springframework.core.io.Resource]
Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.util.ArrayList<?>] to type [org.springframework.core.io.Resource]
    at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:313)
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195)
    at org.springframework.core.convert.support.CollectionToCollectionConverter.convert(CollectionToCollectionConverter.java:87)
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:35)
    ... 36 more

错误提示中最核心的部分是:Failed to convert from type [java.util.ArrayList<?>] to type [java.util.List<org.springframework.core.io.Resource>] for value '[/WEB-INF/statics/js/]'翻译出来就是:

尝试将'[/WEB-INF/statics/js/]从java.util.ArrayList<?> 转换到java.util.List<org.springframework.core.io.Resource>的时候失败了。

在用Spring3.X的时候没有这个问题出现,换成Spring4.X的时候就出现这个问题了,具体的原因不做解释,大体上就是之前的是对于资源的存储使用的是String[]现在改成了ArrayList<>造成的问题。

三、解决方法

  1. 要么移除全局的Formatter。
  2. 要么使用另外的方式进行静态资源的映射。
  3. 更换Spring版本为3.*

但一般都会使用第2个,因为转换器是必须的,而Spring版本一般不会更换,可能会使用到高版本中的一些特性或功能,具体处理步骤如下:

  1. 将会被从客户端浏览器访问的静态资源(例如js、css、html)从WEB-INF下移动到WebApp下面。
  2. 注释或删除SpringMVC配置文件中的<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>代码
  3. 在SpringMVC的xml配置中加上,它的意思就是没有映射到的URL交给默认的web容器中的servlet进行处理:

最终的关键配置如下:

转载于:https://my.oschina.net/ProgramerLife/blog/2966625

你可能感兴趣的文章
CPU的段寄存器
查看>>
linux 安装nginx
查看>>
Kettle的概念学习系列之Kettle是什么?(一)
查看>>
Qt 3D教程(二)初步显示3D的内容
查看>>
100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】
查看>>
compareTo返回值为-1 、 1 、 0 的排序问题
查看>>
Being a Good Boy in Spring Festival(杭电1850)(尼姆博弈)
查看>>
微服务间如何选择推送和拉取数据
查看>>
互联网+时代IT管理者的转型
查看>>
Linux系统调用--getrlimit()与setrlimit()函数详解【转】
查看>>
限制容器的 Block IO - 每天5分钟玩转 Docker 容器技术(29)
查看>>
cocos2dx下的A星算法
查看>>
RabbitMQ的应用场景以及基本原理介绍(转)
查看>>
Nginx:413 Request Entity Too Large解决
查看>>
飘雪代码2枚
查看>>
linux crontab详解
查看>>
HTTP 请求头 WIKI 地址
查看>>
ASP.NET CORE中使用Cookie身份认证
查看>>
Dynamics CRM 2016 Web API 消息列表
查看>>
项目微管理3 - 面试
查看>>