Spring MVC 碰到 java.lang.NoSuchFieldError: APPLICATION_CONTEXT_ID_PREFIX

Spring MVC 应用在 Tomcat 启动的时候出现了下面的错误:

java.lang.NoSuchFieldError: APPLICATION_CONTEXT_ID_PREFIX
 at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:430)
 at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)
 at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)
 at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306)
 at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
 at javax.servlet.GenericServlet.init(GenericServlet.java:212)
 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173)
 at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)
 at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4350)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4659)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
 at org.apache.catalina.core.StandardService.start(StandardService.java:519)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2011-5-23 22:39:21 org.apache.coyote.http11.Http11Protocol start

查到网上 http://www.kissrain.org/2011-03-21-246.html 别人是说“依赖的Spring jar包有问题,解决方案:清空M2_REPO目录下的Spring jar包,重新mvn eclipse:eclipse当前工程即可。”

不过我清掉了目录 \repository\org\springframework\spring 下的文件,让 m2eclipse 重新下载,里面又是只有 2.5.6 的 spring jar 文件,这就有点奇怪了,明明我在 pom.xml 中是引入的 spring 3.0.5 的 spring 包。于是找找这个 2.5.6  版本是谁引进来,想起来了:

之前所做了的事情是在项目的 pom.xml 文件中加了:

 因为要用 JsonView,即在 spring-servlet.xml 文件里配置了:

这个2.5.6 的 spring jar 文件是由 spring-json 引进来的,这时必须用 <excludes> 把它所依赖的 spring 2.5.6 的排除掉。因为存在 spring 2.5.6 的时候,这个版本的 spring 相关类被悲剧的先加载了。把 spring-json 的 <dependency> 部分改成如下:

 完了之后再启动 Tomcat,这个问题可以解决了。

只是我又碰上问题,跟上面是无关的:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'viewResolver' defined in class path resource [spring-servlet.xml]: Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/views.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/views.xml]
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)

原因是在 spring-servlet.xml  中配置了:

<beans:bean name="viewResolver"  class="org.springframework.web.servlet.view.XmlViewResolver"/>

就是说要一个 /WEB-INF/views.xml 文件,应该可以配置使用别的 views.xml 文件吧,算了先注释掉这行配置,需要时再解决它。

本文链接 https://yanbin.blog/spring-mvc-no-such-field-error-application_context_id_prefix/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments