我有一个spring引导应用程序,它有一个spring控制器。我正在尝试使用Accept对rest进行版本化。
下面是我的控制器的样子
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时传递的接受标头是什么版本,都会调用"getByappleId“方法,因此只返回version 1响应。
我的控制器有什么问题吗?
发布于 2017-05-08 17:29:18
正如在这个答案中所描述的:https://stackoverflow.com/a/34427044/258813 (以及注释中提到的)不支持使用这样的头进行路由。
如果您希望通过版本头来支持路由,我将推荐一个自定义路由条件和注释--当然,如果您正在构建一个大型API,它将导致代码更少和更优雅的解决方案。
您可以定义一些注释,比如@ApiVersion(1),它可以添加到任何也是请求映射的方法中,然后添加自定义路由条件,它将正确运行。
我在这里描述了使用自定义路由条件和注释(基于子域--但可以很容易地切换到检查头):http://automateddeveloper.blogspot.co.uk/2014/12/spring-mvc-custom-routing-conditions.html。
发布于 2017-05-05 10:11:51
有许多实现REST版本控制的选项:
(headers = "Accept=application/vnd.name.v1+json")
(headers = "Accept=application/vnd.name.v2+json")@GetMapping("apples/v1/{id})"
@GetMapping("apples/v2/{id})所以你得决定走哪条路。一些有用的链接:
https://stackoverflow.com/questions/43594132
复制相似问题