使用Spring进行精确的RequestMapping

时间:2013-04-09 20:55:32

标签: java spring

我在Spring中有以下内容

@RequestMapping("/hello")

然而,Spring会自动为/ hello /和/hello.*添加映射。如何进行精确的网址匹配?

只有/你好才能工作,其他任何事情应该是404

3 个答案:

答案 0 :(得分:4)

关闭useSuffixPatternMatch上的后缀匹配(RequestMappingHandlerMapping)将解决您的问题,但如果您在配置中使用<mvc:annotation-driven/>(而不是手动接线),这样做实际上并不那么容易所有必要的基础设施bean)。在这种情况下,定义类型为RequestMappingHandlerMapping的其他bean将不会产生任何影响。

您有两种选择:

  1. 删除<mvc:annotation-driven/>将其扩展为一组等效的bean定义,您可以在其中应用useSuffixPatternMatch设置。

  2. 保持<mvc:annotation-driven/>不变,并使用更简单的解决方法:https://jira.springsource.org/browse/SPR-9371。这基本上添加了BeanPostProcessor,它检索由mvc名称空间创建的RequestMappingHandlerMapping bean,并设置上面提到的标志。

  3. 还有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