【问题标题】:<mvc:annotation-driven /> with un-annotated controllers<mvc:annotation-driven /> 带有未注解的控制器
【发布时间】:2011-11-04 04:57:13
【问题描述】:

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

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

问题是&lt;mvc:annotation-driven /&gt; 导致请求映射(通过 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 代码更改最少的解决方案。

谢谢!

【问题讨论】:

    标签: java spring-mvc annotations


    【解决方案1】:

    当您将 &lt;mvc:annotation-driven /&gt; 添加到您的配置时,它会替换默认的处理程序映射和处理程序适配器集,而这些默认值就是处理旧式控制器的那些。

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

    如果做不到这一点,您可以恢复旧控制器的映射和适配器。您没有说明您的控制器过去是如何映射其 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"/>
    

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

    【讨论】:

    • 感谢您提供这个非常有用的答案。我的旧控制器使用 name=url 方法进行映射,所以我将 BeanNameUrlHandlerMapping 添加到我的 dispatcher-servlet.xml 中,现在它又可以工作了。按照您的回答,我花了一些时间阅读有关处理程序映射和处理程序适配器的信息(不了解它们)。现在我的问题是在 Spring 3 中,自动定义了哪些处理程序映射和处理程序适配器?我猜 DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter 但还有其他吗?你能指导我到文档和/或代码中提到的地方吗?再次感谢!
    【解决方案2】:

    我发现通过将 mvc:annotation-driven 分解为它的实际替换,更容易弄清楚。

    &lt;mvc:annotation-driven /&gt; 爆炸成这样:

    <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" />
    

    我所有的旧控制器都可以正常工作。

    【讨论】:

    • 谢谢你,布拉德,你的解决方案。它对我有用。有趣的是,如果我将“mvn:annotation-driven”放入配置中,则会收到“应用程序有重定向循环”错误消息,但爆炸版本工作正常。
    • 我对旧控制器使用 SimpleUrlHandlerMapping。使用 Spring 2.5。添加以下内容使带注释的控制器和旧控制器都像小菜一碟一样工作! 。谢谢!
    • 有没有人想知道您的解决方案为何有效?是不是因为 Spring 自带了一个默认的适配器集,而定义“AnnotationMethodHandlerAdapter”简单地覆盖了默认的适配器设置?
    • 你是怎么做的“将 mvc:annotation-driven 分解成它的实际替换”位?
    • 很久以前,我发现了一个春季小伙子的博客,揭开了它的神秘面纱,但现在我似乎再也找不到它了。这是类似的东西,但原来的有上面的实际文字:thespringthing.blogspot.com/2010/10/…
    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 2012-02-19
    • 2011-04-11
    • 2013-01-21
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多