我在春天有以下
@RequestMapping("/hello")
然而 Spring 会自动为 /hello/ 和 /hello.* 添加映射。如何进行精确的 URL 匹配?
只有 /hello 应该可以工作,其他的应该 404
关闭后缀匹配 ( useSuffixPatternMatch
)RequestMappingHandlerMapping
将解决您的问题,但如果您<mvc:annotation-driven/>
在配置中使用(而不是手动连接所有必要的基础设施 bean),这样做实际上并不容易。在这种情况下,定义一个额外的 bean 类型RequestMappingHandlerMapping
不会有任何效果。
你有两个选择:
删除<mvc:annotation-driven/>
将其扩展为一组等效的 bean 定义,您可以在其中应用该useSuffixPatternMatch
设置。
保持<mvc:annotation-driven/>
原样,并使用此处描述的更简单的解决方法:https ://jira.springsource.org/browse/SPR-9371 。这基本上添加了一个BeanPostProcessor
检索RequestMappingHandlerMapping
由 mvc 命名空间创建的 bean,并设置上述标志。
还有另一张票RequestMappingHandlerMapping
要求自定义由 mvc 命名空间创建的命名空间应该更容易,而无需像上面那样应用黑客攻击。您可以考虑对这张票进行投票。
如果您使用的是 3.1/3.2 版本,那么您可以在不评论或删除的情况下尝试此操作
public class MvcConfigurationPostProcessor implements BeanPostProcessor, PriorityOrdered {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof RequestMappingHandlerMapping) {
((RequestMappingHandlerMapping) bean).setUseSuffixPatternMatch(false);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public int getOrder() {
return PriorityOrdered.HIGHEST_PRECEDENCE;
}
}
在 xml 配置中使用上述后处理器。
<bean class="com.beanprocbug.melia.MvcConfigurationPostProcessor" />
<mvc:annotation-driven />
您可以像这样关闭后缀匹配:
<bean name="handlerMapping" class="...annotation.RequestMappingHandlerMapping">
<property name="useSuffixPatternMatch" value="false"></property>
</bean>
有关详细信息,请参阅RequestMappingHandlerMapping。