【问题标题】:SpringBoot accessing params inside methodSpringBoot 访问方法内部的参数
【发布时间】:2022-09-23 02:30:34
【问题描述】:

Spring/SpringBoot 的新手,我有两种方法,如下所示 -

1.

@GetMapping(\"/score\")
public UserScoreRes getUserScore(@RequestHeader(\"api-key\") String apiKey,
                                @RequestHeader(\"jwt\") String jwt,
                                @RequestParam(name = \"date\", defaultValue = \"2022-07-15\") String dateStr) {

.....
}
@GetMapping(value = \"/score\", params =\"behaviour-version=2\")
public UserScoreResV2 getUserScoreV2(@RequestHeader(\"api-key\") String apiKey,
                                    @RequestHeader(\"jwt\") String jwt,
                                    @RequestParam(name = \"date\", defaultValue = \"2022-07-15\") String dateStr) {

....
}

在方法 2 (getUserScoreV2) 中,我怎样才能得到behaviour-version方法里面?

试过 -

@GetMapping(value = \"/score\", params =\"behaviour-version=2\")
public UserScoreResV2 getUserScoreV2(@RequestHeader(\"api-key\") String apiKey,
                                    @RequestHeader(\"jwt\") String jwt,
                                    @RequestParam(name = \"behaviour-version\", required = false) String behaviourVersion,
                                    @RequestParam(name = \"date\", defaultValue = \"2022-07-15\") String dateStr) {

....
}

但它是不是在职的。

无法修改方法 1 (getUserScore),因为在生产中发布了一个版本。

  • 你想要相同的端点但不同的实现,对吗?
  • 你想在控制器级别处理这个吗?
  • 你为什么需要它?该值始终为 2...@GetMapping(或@RequestMapping)中的参数,顾名思义,用于映射.因此,如果您有一个带有参数 behaviour-version=3 的请求,它将不会匹配并且不会调用此方法。因此,将该参数作为参数并不会增加太多,因为在这种情况下它将始终为 2。
  • @YJR - 你是对的,我想要“相同的端点但不同的实现”。怎么做?可以请提及不同的方法吗?
  • @M。 Deinum - 你是对的,如果我希望这个值“行为版本”是动态的,作为用户的输入,那么该怎么做呢?

标签: spring spring-boot spring-mvc spring-rest


【解决方案1】:

尝试这个

@GetMapping(value = "/score", params ="behaviour-version=2")
public UserScoreResV2 getUserScoreV2(@RequestHeader("api-key") String apiKey,
                             @RequestHeader("jwt") String jwt,
                             @RequestParam(name = "date", defaultValue = "2022-07-15") String dateStr,
                             ServletRequest request) {
    String behaviorVersion = request.getParameter("behaviour-version");
}

警告

正如 Deinum 提到的,行为版本应该是 2。
否则,您无法发送请求。服务器将返回 400 错误

【讨论】:

    【解决方案2】:

    您可以使用处理程序拦截器来执行此操作。您需要做的是,当应用程序收到带有 behaviour_version 标头或参数的 /score 端点请求时,您必须通过 preHandler 将其重定向到另一个端点(例如:/score/v2)。

    然后调用者可以发送带有附加标头的相同端点的请求。 spring boot拦截器根据header重定向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      相关资源
      最近更新 更多