SpringMVC @PathVariable 被截断

标签 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 最后有一个空格,比如“abc”甚至“abc%20”,那么我在 Controller 中得到的变量 id 只是“abc”而不是“abc”

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

最佳答案

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

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

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

这会调用以“/”分隔的标记对 url 进行标记化,但也会修剪字符串。简单的方法是将第二行改为:
    String[] pathDirs = StringUtils.tokenizeToStringArray(path, this.pathSeparator, false, true);

此调用 '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>

在这行中,您显式地创建了“DefaultAnnotationHandlerMapping”并为您修改后的 AntPathMatcher 版本建立了 PathMatcher。

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

关于SpringMVC @PathVariable 被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23797077/

相关文章:

java - 如何将 HashMap 键映射到 thymeleaf 中的选择?

java - 为什么改变 joinColumn 的顺序,hibernate 返回正确或不正确的查询?

一个bean的Spring静态初始化

java - Spring MVC项目用hibernate无法理解如何在jsp中使用

java - Spring Cloud 2020.0 不再处理 bootstrap.yml 配置

java - spring security - 拒绝访问处理程序

java - 修改父类(super class)中的注释值并使用新值动态实例化子类

java - Struts2 + Spring Security 2.06 : Valuestack is null when attempting to use @Secured on an Action method

java - 无法在 IntelliJ 中进入 Debug模式的方法?

java - Spring Autowiring : Caused by: java. lang.IllegalArgumentException:无法设置空TableModel