spring为我们提供了多种处理器映射的支持,比如org.springframework.web.servlet.handler.SimpleUrlHandlerMapping、
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping、org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,等等。
我用SimpleUrlHandlerMapping和DefaultAnnotationHandlerMapping比较多,其它的基本没用过。
最近在项目中使用了BeanNameUrlHandlerMapping,发现有这样一个现象:
如果没有明确声明任何处理器映射,spring会默认使用BeanNameUrlHandlerMapping,但如果明确声明了其它的处理器映射,则需要将BeanNameUrlHandlerMapping明确声明出来,而且在每个包含被映射的bean的配置文件中都要加入BeanNameUrlHandlerMapping,否则会抛异常:
WARN - No mapping found for HTTP request with URI [/BOSS_SUPPORT/service/httpService] in DispatcherServlet with name 'backend'
2010-01-08 11:14:57 [backend]:253 ERROR - Servlet.service() for servlet backend threw exception
java.io.IOException: Did not receive successful HTTP response: status code = 404, status message = [Not Found]
从异常看,报告没有找到相应的映射地址,这个现象很是奇怪,也许是我没有搞清楚,不过在网上也没有找到相关的说明,希望高手指点。
相关配置文件如下:
主配置文件a.xml:
<!-- 定义注解URL映射处理器 -->
<bean id="urlMapping"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors" ref="interceptors" />
<property name="order" value="1"></property>
</bean>
<bean id="beanNameUrlHandlingMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors" ref="interceptors" />
<property name="order" value="2"></property>
</bean>
包含映射的一个配置文件b.xml:
<bean id="httpService" name="/httpService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service">
<ref bean="ucService" />
</property>
<property name="serviceInterface" value="com.netqin.baike.service.UcService"/>
</bean>
以上两个文件都在服务器启动时加载,虽然a.xml中已经声明了BeanNameUrlHandlerMapping,但如果b.xml中没有声明BeanNameUrlHandlerMapping,系统就会抛异常。