spring MVC 控制器版本控制

Posted

技术标签:

【中文标题】spring MVC 控制器版本控制【英文标题】:spring MVC controller versioning 【发布时间】:2017-09-21 11:48:01 【问题描述】:

我有一个 spring boot 应用程序,它有一个 spring MVC 控制器。我正在尝试使用 Accept 标头对我的 rest api 进行版本控制。

以下是我的控制器的样子

RestController
@RequestMapping(value = "/private/")
public class AppleController 

  private final AppleService appleService;

  public AppleController(AppleService appleService) 
    this.appleService = appleService;
  

  @GetMapping(value = "apples/id", produces = "application/json; v=1.0",
      headers = "Accept=application/json; v=1.0")
  public ResponseEntity getByappleId(@PathVariable("id") Long appleId) 
    System.out.println("version1");

    GetByappleIdResponse response = appleService.findByappleId(appleId);

    return new ResponseEntity<>(response, HttpStatus.OK);
  



  @GetMapping(value = "apples/id", produces = "application/json; v=2.0",
      headers = "Accept=application/json; v=2.0")
  public ResponseEntity getByappleId2(@PathVariable("id") Long appleId) 
    System.out.println("version2");
    GetByappleIdResponse response = appleService.findByappleId2(appleId);
    return new ResponseEntity<>(response, HttpStatus.OK);
  

无论调用 API 时我在 Accept 标头中传递的版本如何,总是调用“getByappleId”方法,因此只返回版本 1 响应。

我的控制器有什么问题吗?

【问题讨论】:

似乎Accept标头中的accept-params没有被spring使用。 ***.com/questions/34425316/…的可能重复 离题不要使用 system.out 尽可能使用记录器 【参考方案1】:

有很多选项可以实现 REST API 的版本控制:

建议在 cmets 方法中手动路由您的请求;

将版本作为 Accept 标头值的一部分,f.e.:

(headers = "Accept=application/vnd.name.v1+json")

(headers = "Accept=application/vnd.name.v2+json")

将版本作为映射的一部分:

@GetMapping("apples/v1/id)"

@GetMapping("apples/v2/id)

所以你需要决定走哪条路。一些有用的链接:

Versioning a REST API Best practices for API versioning?

【讨论】:

【参考方案2】:

如此答案中所述:https://***.com/a/34427044/258813(并在 cmets 中提到)Spring 不支持使用这样的标头进行路由。

如果您想通过版本标头支持路由,我会推荐自定义路由条件和注释 - 当然,如果您正在构建大型 API,它将导致更少的代码和更优雅的解决方案。

您可以定义一些注释,例如@ApiVersion(1),您可以将其添加到任何同时也是请求映射的方法中,然后添加自定义路由条件,它会正常运行。

我在此处描述了使用自定义路由条件和注释(基于子域 - 但可以轻松切换为检查标头):http://automateddeveloper.blogspot.co.uk/2014/12/spring-mvc-custom-routing-conditions.html

【讨论】:

感谢@rhinds 的回复 最好包含一些代码示例

以上是关于spring MVC 控制器版本控制的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 中用于 CSS / JS 文件的自动版本控制?

一Spring MVC基础

什么是 Spring Boot 版本控制约定?

Spring MVC的常用注解

使用 Header 的 Web Api 版本控制,我们如何使用 Net Framework MVC Api 在 Swagger UI 上使用它

无法使用 Spring Webflux 和 Thymeleaf 对静态资源进行版本控制