在 applicationContext.xml 中添加 <mvc:annotation-driven> 时出错
Posted
技术标签:
【中文标题】在 applicationContext.xml 中添加 <mvc:annotation-driven> 时出错【英文标题】:Error when adding <mvc:annotation-driven> in applicationContext.xml 【发布时间】:2013-12-24 18:30:15 【问题描述】:根据 Spring MVC 文档,标签执行以下操作:
配置 Spring 3 Type ConversionService(PropertyEditors 的替代品) 添加了对使用@NumberFormat 格式化数字字段的支持 如果 Joda Time 在类路径中,则添加对使用 @DateTimeFormat 格式化日期、日历和 Joda Time 字段的支持 如果 JSR-303 Provider 在类路径中,则添加对使用 @Valid 验证 @Controller 输入的支持 如果 JAXB 在类路径上,则添加对读取和写入 XML 的支持(使用 @RequestBody/@ResponseBody 进行 HTTP 消息转换) 如果 Jackson 在类路径上,则添加对读取和写入 JSON 的支持(与 #5 相同)
但是当我将它添加到我的 applicationContext.xml 文件时,服务器(JBoss EAP 6.1)启动时会抛出错误。
这是错误:
08:01:23,435 错误 [org.springframework.web.context.ContextLoader](ServerService 线程池 -- 68)上下文初始化失败:org.springframework.beans.factory.BeanCreationException:创建名为“requestMappingHandlerMapping”的 bean 时出错在类路径资源 [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class] 中定义:bean 的实例化失败;嵌套异常是 org.springframework.beans.factory.BeanDefinitionStoreException: 工厂方法 [public org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.requestMappingHandlerMapping()]抛出异常;嵌套异常是 java.lang.ClassCastException:org.springframework.web.accept.ContentNegotiationManagerFactoryBean$$EnhancerByCGLIB$$6af53d42 不能转换为 org.springframework.web.accept.ContentNegotiationManager
这是 web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<session-config>
<session-timeout>20</session-timeout>
</session-config>
</web-app>
这是applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<mvc:annotation-driven />
<context:component-scan base-package="br.gov.saude.ouvidor.apresentacao" />
<context:component-scan base-package="br.gov.saude.ouvidor.apresentacao.controller " />
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
这是 pom.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xxx-xxxx</artifactId>
<packaging>war</packaging>
<name>xxx-xxxx</name>
<properties>
<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>
<parent>
<groupId>xxx.xxx.xxxxxxxx</groupId>
<artifactId>xxxxxxx</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.19</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.19</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>$project.artifactId</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<optimize>true</optimize>
<debug>true</debug>
<outputFileName>$project.artifactId</outputFileName>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warName>$project.artifactId</warName>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
删除标签<mvc:annotation-driven>
一切正常。有什么问题?任何帮助将不胜感激。
谢谢!
【问题讨论】:
你在使用 Maven 吗?你能发布一个POM文件吗? 是的,我是。 pom.xml 已添加到问题中。谢谢! 在 org.springframework mvc 依赖中包含版本。它可能会导致问题,例如:ControllerClassNameHandlerMapping
,上下文是否会实例化?
【参考方案1】:
在web.xml
文件中,您指定将使用Java 配置来设置MVC 组件,但是尝试在applicationContext.xml
文件中设置MVC 组件。
web.xml
中的ContextLoaderListener
设置为启动/WEB-INF/applicationContext.xml
配置文件。 applicationContext.xml
设置的容器不应包含 MVC 组件,但应用于在 MVC
范围之外注册 bean,例如用于数据持久性的那些。
如果你真的想使用 Java 配置来设置 Spring MVC 组件,你必须将所有在 applicationContext.xml
文件中建立的 Spring MVC 组件移动到一个带有 @Configuration
注释的 Java 类中,并将 XML bean 转换为适当的Java 中的配置。
见:Spring + Web MVC: dispatcher-servlet.xml vs. applicationContext.xml (plus shared security)
【讨论】:
感谢@KenvinBowersox。真正的问题是我将 xml 配置与 java 配置混合在一起。我有一些用“@Configuration”注释的类。删除这些类解决了我的问题。以上是关于在 applicationContext.xml 中添加 <mvc:annotation-driven> 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring applicationContext.xml 中读取 JVM 参数
找不到applicationContext.xml,请问大家,这是怎么回事啊。。
怎么在applicationContext.xml文件中加载其它bean.xml文件或者引用bean.xml文件中的bean id