SpringMVC @PathVariable被截断

dog*_*ish 5 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) 
Run Code Online (Sandbox Code Playgroud)

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

你能建议一种方法来解决这个问题

Fer*_*con 2

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

如果你查看这个类,你可以看到:

    String[] pattDirs = StringUtils.tokenizeToStringArray(pattern, this.pathSeparator);
    String[] pathDirs = StringUtils.tokenizeToStringArray(path, this.pathSeparator);
Run Code Online (Sandbox Code Playgroud)

这会调用 tokenizen 中以“/”分隔的标记中的 url,但也会修剪字符串。简单的方法是将第二行更改为:

    String[] pathDirs = StringUtils.tokenizeToStringArray(path, this.pathSeparator, false, true);
Run Code Online (Sandbox Code Playgroud)

此调用“false”表示您不想修剪字符串。

但坏消息是这个类是在 spring 框架中的。然后你需要扩展这个类或者复制并更改它并向spring指示使用你自己的类而不是spring类。

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

<bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="pathMatcher">
        <bean class="practica1.impl.OwnAntPathMatcher" />
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

通过此行,您显式创建“DefaultAnnotationHandlerMapping”并将 PathMatcher 建立到您修改后的 AntPathMatcher 版本。

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