SpringMVC @PathVariable被截断

时间:2014-05-22 02:54:30

标签: spring spring-mvc spring-annotations

我正在使用SpringMVC 3.1.3。 如果@PathVariable最后有空格,则会截断/修剪它。有没有办法阻止修剪

 @RequestMapping(value="deleteConfig/{id}/", method=RequestMethod.DELETE)
 public @ResponseBody JsonResponse<?> deleteConfig(@PathVariable("id") String id) 

如果来自客户端的id最后有一个空格,比如 - &#34; abc&#34;甚至&#34; abc%20&#34;那么我在控制器中得到的变量id就是&#34; abc&#34;而不是&#34; abc&#34;

你能建议一种解决方法吗

1 个答案:

答案 0 :(得分:2)

问题出在Spring Framework的AntPatternMatcher类中。 MVC使用此类来查找必须根据模式调用哪个方法和控制器,但它也负责提取路径变量。

如果您查看此课程,您可以看到:

    String[] pattDirs = StringUtils.tokenizeToStringArray(pattern, this.pathSeparator);
    String[] pathDirs = StringUtils.tokenizeToStringArray(path, this.pathSeparator);

这会将令牌标记为由#34; /&#34;分隔的标记中的标记,但也会修剪字符串。简单的方法是将第二行更改为:

    String[] pathDirs = StringUtils.tokenizeToStringArray(path, this.pathSeparator, false, true);

这称为“假”&#39;表示你不想修剪字符串。

但最糟糕的是,这个类是在spring框架中。然后你需要扩展这个类或复制并更改它并指示spring使用你自己的类而不是spring类。

您需要更改Web上下文中的DefaultAnnotationHandler,如下所示:

<bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="pathMatcher">
        <bean class="practica1.impl.OwnAntPathMatcher" />
    </property>
</bean>

这一行你明确地创建了&#39; DefaultAnnotationHandlerMapping&#39;并将PathMatcher建立到修改后的AntPathMatcher版本。

要小心,因为如果在上下文中显式创建一个处理程序映射,则不会创建所有其他默认处理程序。