Java 弹簧座控制器-同一收割台的不同值

Java 弹簧座控制器-同一收割台的不同值,java,spring,spring-restcontroller,spring-rest,Java,Spring,Spring Restcontroller,Spring Rest,我有一个Spring REST控制器和两个单独的GetMapping,它们具有相同的值,但每个都接受相同头的不同头值(即,一个GET方法用于v1,一个GET方法用于v2) 如果实现没有从一个版本更改到另一个版本,使用一个可以接受任何一个标头值的方法的最佳方式是什么 理想情况下,该解决方案将允许我为具有不同实现的不同版本使用不同的方法,以便能够使用OpenAPI正确地记录这些方法。类似于以下内容: @GetMapping(value = "/{id}", headers =

我有一个Spring REST控制器和两个单独的GetMapping,它们具有相同的值,但每个都接受相同头的不同头值(即,一个GET方法用于v1,一个GET方法用于v2)

如果实现没有从一个版本更改到另一个版本,使用一个可以接受任何一个标头值的方法的最佳方式是什么

理想情况下,该解决方案将允许我为具有不同实现的不同版本使用不同的方法,以便能够使用OpenAPI正确地记录这些方法。类似于以下内容:

@GetMapping(value = "/{id}",  headers = { "Accept-version=v1 OR Accept-version=v2"})
public UserV1 findByIdV1(@PathVariable long id) {
  return ...;
}

// Different response, thus need different method to be able to document this.
@GetMapping(value = "/{id}",  headers = { "Accept-version=v3"})
public UserV3 findByIdV2(@PathVariable long id) {
  return ...;
}

您可以使用
@RequestHeader
将方法中的头信息作为参数传递:

@GetMapping(value = "/{id}")
public UserV1 findByIdV2(
    @PathVariable long id, 
    @RequestHeader("Accept-version") String acceptVersion
) {
    // make a decision based on acceptVersion
    return ...;
}

您可以通过
Accept
header执行此操作

Github API就是一个很好的例子:

Spring实现:

@GetMapping(value = "/{id}", headers = {"Accept=application/vnd.api.v1+json", "Accept=application/vnd.api.v2+json"})
public UserV1 findByIdV1(@PathVariable long id) {
  return ...;
}

@GetMapping(value = "/{id}", headers = "Accept=application/vnd.api.v3+json")
public UserV3 findByIdV2(@PathVariable long id) {
  return ...;
}

注意:您可以更改自己域名上的
api
部分,
vnd.
部分由指定,用于区分标准媒体类型和自定义媒体类型。

我考虑过这一点,但我希望在响应对象发生变化时,版本发生变化时有不同的方法-以便我可以使用openapi在问题中记录它:“……使用单一方法的最佳方式是什么……”。在评论中:“……我希望有不同的方法……”。这取决于你想要什么。你是对的,我会更新我的问题。对于具有相同实现的不同版本,需要相同的方法,但是对于具有不同实现的版本,需要不同的方法。
@GetMapping(value = "/{id}", headers = {"Accept=application/vnd.api.v1+json", "Accept=application/vnd.api.v2+json"})
public UserV1 findByIdV1(@PathVariable long id) {
  return ...;
}

@GetMapping(value = "/{id}", headers = "Accept=application/vnd.api.v3+json")
public UserV3 findByIdV2(@PathVariable long id) {
  return ...;
}