这是问题的延续 Spring MVC @PathVariable被截断

Spring论坛声明它已经固定(3.2版本)作为ContentNegotiationManager的一部分。请看下面的链接。 https://jira.springsource.org/browse/SPR-6164 https://jira.springsource.org/browse/SPR-7632

在我的应用程序中,带有。com的requestParameter被截断了。

谁能告诉我如何使用这个新功能?如何在xml中配置它?

注:春季论坛- #1 Spring MVC @PathVariable带点(.)会被截断


当前回答

如果你同时写后面和前面,另一个简单的解决方案是在前面的URL末尾附加一个“/”。如果是这样,你不需要改变你的后端…

somepath/myemail@gmail.com/

是快乐!

其他回答

解决这个问题的一个非常简单的方法是在后面添加一个斜杠…

例如:

使用:

/somepath/filename.jpg/

而不是:

/somepath/filename.jpg

/ somepath /{变量:。+}适用于Java requestMapping标签。

如果您正在使用Spring 3.2+,那么下面的解决方案将有所帮助。这将处理所有的url,所以肯定比在请求URI映射中应用regex模式更好。喜欢/ somepath /{变量:。+}

在xml文件中定义一个bean

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
        <property name="useSuffixPatternMatch" value="false"/>
        <property name="useRegisteredSuffixPatternMatch" value="true"/>
    </bean>

标志的用法可以在文档中找到。我把剪报解释一下

解释useRegisteredSuffixPatternMatch据说可以解决这个问题。来自类中的java文档

If enabled, a controller method mapped to "/users" also matches to "/users.json" assuming ".json" is a file extension registered with the provided {@link #setContentNegotiationManager(ContentNegotiationManager) contentNegotiationManager}. This can be useful for allowing only specific URL extensions to be used as well as in cases where a "." in the URL path can lead to ambiguous interpretation of path variable content, (e.g. given "/users/{user}" and incoming URLs such as "/users/john.j.joe" and "/users/john.j.joe.json").

对我来说

@GetMapping(path = "/a/{variableName:.+}")

确实工作,但只有当你也编码的“点”在你的请求url为“%2E”,然后它工作。但要求URL都是…虽然有效,但这不是“标准”编码。感觉像是一个bug:|

另一种类似于“后斜杠”的方法是移动带有点“inline”ex的变量:

@GetMapping(path = "/{variableName}/a")

现在所有的点都将被保留,不需要修改。

在Spring Boot Rest Controller中,我通过以下步骤解决了这些问题:

RestController:

@GetMapping("/statusByEmail/{email:.+}/")
public String statusByEmail(@PathVariable(value = "email") String email){
  //code
}

从Rest客户端:

Get http://mywebhook.com/statusByEmail/abc.test@gmail.com/