【发布时间】:2014-07-21 07:45:13
【问题描述】:
我正在使用 Spring-MVC 的 MultiActionController 和 PropertiesMethodNameResolver 将 URL 映射到我的 Controller 类的 apppriate 方法。要求是将包含特定单词“abc”的所有网址映射到一种方法,将“xyz”映射到第二种方法,依此类推。所有 url 可以是任意长的,因此必须使用正则表达式模式匹配,所有 url 都以相同的扩展名结尾,所有剩余的 url 应该映射到默认方法。因此,我们使用以下内容:
<bean id="paramMultiController" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
<property name="methodNameResolver">
<ref bean="propsResolver" />
</property>
<property name="delegate">
<ref bean="methodsContainer" />
</property>
</bean>
<bean id="methodsContainer" class="com.abc.controller.MethodsContainer"/>
<bean id="propsResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/">defaultMethod</prop>
<prop key="/**/abc.ext">methodAbc</prop>
<prop key="/def/**/*.ext">methodDef</prop>
<prop key="/xyz/**/*.ext">methodXyz</prop>
<prop key="/**/ijk/**/*.ext">makeIjk</prop>
<prop key="/**/*.ext">defaultMethod</prop>
</props>
</property>
</bean>
这在我们使用 Spring-2.5 之前一直有效,但最近当我们升级到 Spring-4.0 时开始出现问题。我发现问题的原因是 PropertiesMethodNameResolver 从 Spring-2.5 到 Spring-3.0 的代码更改。早期的 PropertiesMethodNameResolver 使用 Iterators 来迭代定义的映射并将其与请求的 URL 进行匹配,但 Spring-3.0 切换到开始使用 Enumerator 并且顺序混乱,导致 url 主要与 defaultMethod 匹配。
您能否提出解决方案。我们希望按照我们在配置文件中定义的顺序处理(匹配)url。请注意,我们不想使用注解,因为我们有太多的 URL 映射,并且使用注解会将 URL 映射传播到许多类,从而难以合并和管理映射。
【问题讨论】:
标签: spring spring-mvc model-view-controller url-mapping