前言:我在springMVC中使用FreeMarkerViewResolver中,遇到的一个超大的坑,我一直没想到,因为FreeMarker依赖spring-context-support,所以很多人把一开始使用FreeMarkerViewResolver就忽略掉了之前已经添加的spring-context这个依赖,两者冲突导致,控制器的接收参数功能出现问题,下面详解
首先为啥会出现这种问题?
我把异常截图放出来
异常信息:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
这里大概的意思就是这种参数类型是无效的,且没有从类中找到这种参数的信息,其实也就是在控制器的参数上没加@RequestParma
指定参数名字,但是我们都知道之前根本不用指定的情况下也能接收参数,所以这里就出现了一个mvc的接收参数功能上的缺陷.
我当时在百度上查了很久,很多人出现这种异常,但是解决方法都和情况和我的都不一样,所以不了了之,直到今天我又去使用了,还是这种问题,我就觉得自己排查下原因,排了很久都没有结果,最后我认为可能是在依赖上的问题,但是我排查了很久都不觉得有什么问题.
最后我还是锁定在了spring-context
和spring-contex-support
这两个依赖上,我在想会不会这两个依赖发生了冲突,结果果不其然,我把spring-context-support
删掉以后,把视图解析器换回了InternalResourceViewResolver
,果然在形参上不加@requestParma
也没问题了,最后我百度看了下spring-context-support
,发现它是对spring-context
的拓展,其功能已经包含了spring-context
,难怪会出现版本冲突,最后我换回FreeMarkerViewResolver
视图解析器,把spring-context
删掉,把spring-context-support
加回去,果然没问题,之前的问题都解决了,这里需要注意的是,测试的时候,如果是maven项目,需要执行clean,然后再重新编译打包,不然残留之前的编译文件,可能还是有问题。
结论:需要用到FreeMarkerViewResolver
的时候把之前填加的spring-context删出,留下spring-context-support
,不用的话也可以留着这一个,总之我不管用不用我还是觉得使用spring-context-support
更好,比较包含了spring-context的一切功能,万一以后要用到FreeMark呢