我正在使用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;
你能建议一种解决方法吗
答案 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版本。
要小心,因为如果在上下文中显式创建一个处理程序映射,则不会创建所有其他默认处理程序。