我的项目包括较旧的未注释控制器以及较新的基于注释的控制器。
我正在使用最新的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代码进行最小更改的解决方案。
谢谢!
答案 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" />
我所有的旧控制器都工作了。