在 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>

删除标签&lt;mvc:annotation-driven&gt; 一切正常。有什么问题?任何帮助将不胜感激。

谢谢!

【问题讨论】:

你在使用 Maven 吗?你能发布一个POM文件吗? 是的,我是。 pom.xml 已添加到问题中。谢谢! 在 org.springframework mvc 依赖中包含版本。它可能会导致问题,例如:3.2.0.RELEASE 你也在使用java配置(@Configuration)吗?如果是这样,@EnableWebMvc 声明可能与 mvc:annotation-driven tag 冲突 如果删除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> 时出错的主要内容,如果未能解决你的问题,请参考以下文章

applicationContext.xml详解

如何在 Spring applicationContext.xml 中读取 JVM 参数

找不到applicationContext.xml,请问大家,这是怎么回事啊。。

怎么在applicationContext.xml文件中加载其它bean.xml文件或者引用bean.xml文件中的bean id

Spring:为啥我在使用注解时需要 applicationContext.xml?

在 applicationContext.xml 中找不到 Spring 配置资源