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 文件中加了:
1 2 3 4 5 |
<dependency> <groupId>net.sf.spring-json</groupId> <artifactId>spring-json</artifactId> <version>1.3.1</version> </dependency> |
因为要用 JsonView,即在 spring-servlet.xml 文件里配置了:
1 2 3 4 5 6 7 8 |
<beans:bean name="jsonView"> <beans:property name="jsonWriter"> <beans:ref bean="jsonlibJsonWriter"/> </beans:property> </beans:bean> <beans:bean name="jsonlibJsonWriter" class="org.springframework.web.servlet.view.json.writer.jsonlib.JsonlibJsonStringWriter"/> |
这个2.5.6 的 spring jar 文件是由 spring-json 引进来的,这时必须用 <excludes> 把它所依赖的 spring 2.5.6 的排除掉。因为存在 spring 2.5.6 的时候,这个版本的 spring 相关类被悲剧的先加载了。把 spring-json 的 <dependency> 部分改成如下:
1 2 3 4 5 6 7 8 9 10 11 |
<dependency> <groupId>net.sf.spring-json</groupId> <artifactId>spring-json</artifactId> <version>1.3.1</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </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 文件吧,算了先注释掉这行配置,需要时再解决它。