【问题标题】:Path variables containing .com, .org are truncated in REST API包含 .com、.org 的路径变量在 REST API 中被截断
【发布时间】:2014-08-03 12:43:11
【问题描述】:

我遇到了一个奇怪的问题。 这是我的 REST API 映射

@RequestMapping(
    value = { "/{email}" },
    method = RequestMethod.GET,
    params = "time")
public void getEmail(
    @PathVariable("email") final String sender,
    @RequestParam(value = "time", required = true) final long time) 

当我这样调用 API 时

/someone@someone.com?time=10

我观察到sender 包含someone@someone 而不是someone@someone.com

当我这样给它时

@RequestMapping(
    value = { "/{email:.+}" },
    method = RequestMethod.GET,
    params = "time")
public void getEmail(
    @PathVariable("email") final String sender,
    @RequestParam(value = "time", required = true) final long time) 

我收到 406 错误。

我也试过了。

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

仍然没有帮助。 我做错了什么?

【问题讨论】:

  • /{email}@PathVariable("sender")?你确定命名?
  • 嗨,我更新了正确的名字
  • 需要更多上下文。这些注释来自哪个库?
  • 这些是 Spring MVC 注释......顺便说一句。我刚刚验证了这种行为。将检查问题可能出在哪里。
  • 您会在 SO Spring MVC @PathVariable with dot (.) is getting truncated 的其他帖子中找到很多解释

标签: java rest path-variables


【解决方案1】:

摘自RequestMappingJavaDoc:

@PathVariable 带注释的参数(仅限 Servlet)用于访问 URI 模板值(即 /hotels/{hotel})。变量值将是 转换为声明的方法参数类型。 默认情况下,URI 模板将匹配正则表达式 [^.]*(即任何 句点以外的字符),但这可以通过指定来更改 另一个正则表达式,例如:/hotels/{hotel:\d+}。 此外,@PathVariable 可用于 Map 以 访问所有 URI 模板变量。

您的第二个映射定义正确且有效。您可能没有正确测试它。

【讨论】:

  • 嗨,当我给出正则表达式时,它返回 406 错误。我已经更新了问题
  • 错误 406 与 Accept 标头有关。您如何测试您的 REST 服务?我还可以看到您的处理程序方法是 void... 不完全确定 Spring 应该如何处理对此类方法的响应。
  • 您好,我正在使用firefox插件RESTClient进行测试
  • 您是否设置了任何明确的Accept 标头?另外我想说的是,不从处理程序方法返回任何值是非常罕见的......(void 被解释为null)。找到正确的 HandlerMethodReturnValueHandler => 可能存在问题,因此有关不支持的响应内容类型的错误...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2023-03-24
  • 2011-05-19
相关资源
最近更新 更多