我正在使用 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/