8

我在春天有以下

@RequestMapping("/hello")

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

只有 /hello 应该可以工作,其他的应该 404

4

3 回答 3

5

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

你有两个选择:

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

  2. 保持<mvc:annotation-driven/>原样,并使用此处描述的更简单的解决方法:https ://jira.springsource.org/browse/SPR-9371 。这基本上添加了一个BeanPostProcessor检索RequestMappingHandlerMapping由 mvc 命名空间创建的 bean,并设置上述标志。

还有另一张票RequestMappingHandlerMapping要求自定义由 mvc 命名空间创建的命名空间应该更容易,而无需像上面那样应用黑客攻击。您可以考虑对这张票进行投票。

于 2013-04-10T08:39:13.380 回答
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 配置中使用上述后处理器。

<bean class="com.beanprocbug.melia.MvcConfigurationPostProcessor" />
<mvc:annotation-driven />
于 2017-03-16T06:00:20.173 回答
1

您可以像这样关闭后缀匹配:

<bean name="handlerMapping" class="...annotation.RequestMappingHandlerMapping">
    <property name="useSuffixPatternMatch" value="false"></property>
</bean>

有关详细信息,请参阅RequestMappingHandlerMapping

于 2013-04-10T08:19:00.373 回答