【问题标题】:How to pass @PathVariable("timeZoneId") in spring? [duplicate]如何在春季传递@PathVariable("timeZoneId")? [复制]
【发布时间】:2020-08-05 04:07:59
【问题描述】:

我在 Spring Boot 1.5.9 中有以下@RestController 方法:

@GetMapping(value = "/today/{timeZoneId}", produces = MediaType.APPLICATION_JSON_VALUE)
public Instant getToday(@PathVariable("timeZoneId") String timeZoneId) {
  return getNextPublishingDateTime(Instant.now(), timeZoneId);
}

当我 GET/today/Europe/Paris 时,我有一个 404 错误。

我尝试GET/today/Europe%2FParis,但也得到了404

这是由于timeZoneId 中的斜线造成的。

如何在 Spring 中将 @PathVariable 用于我的 timeZoneId

【问题讨论】:

  • 真的想把它放在路径中吗?在 REST 哲学中,路径变量应该代表资源。在这里,时区更适合作为查询参数(因为它只是一个格式化配置)。
  • 为什么不使用 timeZoneId 作为请求参数?此问题的重复:stackoverflow.com/questions/2334787/…
  • 它不一定是资源,例如:/profile/{username} 不是资源,您可以根据用户名检查主体。我大体上同意。到目前为止,我使用?timeZoneId,但这个问题应该被视为关于使用包含斜杠的路径变量的方式的一般问题。
  • 回复您的评论,这可能会对您有所帮助:stackoverflow.com/questions/3235219/… 问题是,您不能在 url 中传递正斜杠和其他一些字符作为路径的一部分。

标签: java spring spring-boot spring-data path-variables


【解决方案1】:

一种可能的方法如下,

@GetMapping(value = "/today/{timeZoneIdPrefix}/{timeZoneIdSuffix}", produces = MediaType.APPLICATION_JSON_VALUE)
public Instant getToday(@PathVariable("timeZoneIdPrefix") String timeZoneIdPrefix,@PathVariable("timeZoneIdSuffix") String timeZoneIdSuffix) {
  String timeZoneId = timeZoneIdPrefix +"/"+ timeZoneIdSuffix;
  return getNextPublishingDateTime(Instant.now(), timeZoneId);
}

另一种方法可能是,而不是像 Europe/Paris 那样传递,作为 Europe-Paris 传递,然后将 - 替换为 /

 return getNextPublishingDateTime(Instant.now(), timeZoneId.replace("-","/"));

【讨论】:

  • 我对此深有感触,这是我最喜欢的解决方案。?timeZoneId
【解决方案2】:

您会得到 404,因为 Spring 预计在斜线之后只有一个值(编码为 %2F 与否),但在您的情况下,您输入了两个值:Europe 和 Paris。

【讨论】:

  • 编码不能作为一个参数工作,它只是失败,因为它不解码
猜你喜欢
  • 2017-07-28
  • 2013-08-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 2019-12-14
相关资源
最近更新 更多