带有未注释控制器的<mvc:annotation-driven> </mvc:annotation-driven>

时间:2011-08-26 03:13:52

标签: java spring-mvc annotations

我的项目包括较旧的未注释控制器以及较新的基于注释的控制器。

我正在使用最新的Spring jar(3.0.5),在我的dispatcher-servlet.xml中有<mvc:annotation-driven />

问题是<mvc:annotation-driven />导致请求映射(通过dispatcher-servlet.xml中控制器bean的name属性)到我的未注释控制器不能工作...每次我指示请求未注释的控制器我收到错误消息,如:

org.springframework.web.servlet.DispatcherServlet noHandlerFound  
WARNING: No mapping found for HTTP request with URI [/some_path/some_page.htm] in DispatcherServlet with name 'dispatcher'

如何保持未注释的控制器不变,但告诉spring识别他们的(旧式)映射?

我正在寻找对我已经拥有的控制器的Java代码进行最小更改的解决方案。

谢谢!

2 个答案:

答案 0 :(得分:6)

<mvc:annotation-driven />添加到配置中时,它将替换默认的处理程序映射集和处理程序适配器,这些默认值是处理旧式控制器的默认值。

您有2个选项。首先要尝试删除<mvc:annotation-driven />。如果没有这个,您仍然可以使用带注释的控制器。它确实增加了杰克逊JSON支持等额外功能,但如果你不需要这些额外的功能,那么你就不需要了。因此,请尝试不使用<mvc:annotation-driven />的应用,看看它是否仍有效。

如果失败,您可以恢复旧控制器的映射和适配器。您没有说明您的控制器如何映射其URL,但请尝试将这些URL添加到您的配置中:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.handler.ControllerClassNameHandlerMapping"/>

如果你使用了SimpleUrlHandlerMapping,那么它应该已经有效了。

您还需要将HandlerAdapter添加回来:

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

不要盲目地添加这些。单独尝试它们,看看最小的设置是什么让旧控制器与新控制器一起工作。

答案 1 :(得分:6)

我发现通过爆炸mvc:annotation-driven进入它的实际替换,更容易弄明白。

<mvc:annotation-driven />爆炸:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator" ref="validator" />
        </bean>
    </property>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean class="org.springframework.http.converter.FormHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
        </list>
    </property>
</bean>

<!-- Configures a validator for spring to use -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="messageInterpolator">
        <bean class="com.eps.web.spring.validation.SpringMessageSourceMessageInterpolator" />
    </property>
</bean>

<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

一旦魔法消失,我在尝试加载“旧”控制器时遇到此错误: javax.servlet.ServletException: No adapter for handler [org.springframework.web.servlet.mvc.ParameterizableViewController@

从那时起,我添加了

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

我所有的旧控制器都工作了。