我在Spring中有以下内容
@RequestMapping("/hello")
然而,Spring会自动为/ hello /和/hello.*添加映射。如何进行精确的网址匹配?
只有/你好才能工作,其他任何事情应该是404
答案 0 :(得分:4)
关闭useSuffixPatternMatch
上的后缀匹配(RequestMappingHandlerMapping
)将解决您的问题,但如果您在配置中使用<mvc:annotation-driven/>
(而不是手动接线),这样做实际上并不那么容易所有必要的基础设施bean)。在这种情况下,定义类型为RequestMappingHandlerMapping
的其他bean将不会产生任何影响。
您有两种选择:
删除<mvc:annotation-driven/>
将其扩展为一组等效的bean定义,您可以在其中应用useSuffixPatternMatch
设置。
保持<mvc:annotation-driven/>
不变,并使用更简单的解决方法:https://jira.springsource.org/browse/SPR-9371。这基本上添加了BeanPostProcessor
,它检索由mvc名称空间创建的RequestMappingHandlerMapping
bean,并设置上面提到的标志。
还有another ticket要求自定义mvc命名空间创建的RequestMappingHandlerMapping
而不应用上述黑客攻击应该更容易。你可以考虑对这张票进行投票。
答案 1 :(得分:4)
如果您使用的是版本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 config中使用上面的后处理器。
<bean class="com.beanprocbug.melia.MvcConfigurationPostProcessor" />
<mvc:annotation-driven />
答案 2 :(得分:1)
您可以像这样关闭后缀匹配:
<bean name="handlerMapping" class="...annotation.RequestMappingHandlerMapping">
<property name="useSuffixPatternMatch" value="false"></property>
</bean>
有关详细信息,请参阅RequestMappingHandlerMapping。