jos*_*737 6 java versioning rest jax-rs http-headers
我在这个主题中阅读了很多关于REST API版本的内容:API版本化的最佳实践?
因此,我想使用HTTP-Accept-Header来指示客户端要求的版本.但是如何在我的应用程序中应用它?因此,有哪些变化?编组员如何知道应该使用哪个版本?我必须注册我的类型吗?
我所知道的是我必须更改@Produces
-Annotation 的内容
@GET
@Path("/locations")
@Produces("application/vnd.mycompany-v1+xml")
Location[] getLocations();
Run Code Online (Sandbox Code Playgroud)
但还有什么必须改变?
小智 2
您可以使用Variant
JAX-RS 的机制。
@GET
@Path("/locations/{id}")
@Produces(value = {"application/vnd.mycompany-v2+json", // current version
"application/vnd.mycompany-v1+json", // old version
MediaType.APPLICATION_JSON}) // fallback
public Response getLocation(@PathParam("id") Integer id,
@Context Request request) {
MediaType vndTypeV1 = new MediaType("application", "vnd.mycompany-v1+json");
MediaType vndTypeV2 = new MediaType("application", "vnd.mycompany-v2+json");
Variant variant1 = new Variant(vndTypeV1, null, null);
Variant variant2 = new Variant(vndTypeV2, null, null);
Variant variantJson = new Variant(MediaType.APPLICATION_JSON_TYPE, null, null);
List<Variant> variants = new ArrayList<Variant>();
variants.add(variant1);
variants.add(variant2);
variants.add(variantJson);
Variant selectedVariant = request.selectVariant(variants);
Location location = someBackendService.getLocation(id);
// Manipulate location according to which variant is the selectedVariant.
// ...
return Response.ok("{}")
.header(HttpHeaders.CONTENT_TYPE, selectedVariant.getMediaType())
.build();
}
Run Code Online (Sandbox Code Playgroud)
另请参阅Java EE 6 教程。
编辑
没有根据所选变体自动编组实体的方法。这需要一些手动工作。例如:
String version = extractVersionFromVariant(selectedVariant);
if ("v1".equals(version)) {
location.setSomeV1Propery("only in v1);
} else if ("v2".equals(version)) {
location.setSomeV2Propery("only in v2);
}
return Response.ok(location)
.header(HttpHeaders.CONTENT_TYPE, selectVariant.getMediaType())
.build();
Run Code Online (Sandbox Code Playgroud)
如果版本足够不同,我将为每个版本使用 JAXB 带注释的类。每个这样的类将只包含对该版本有效的属性。JAX-RS 会小心地将它们编组为 JSON。
归档时间: |
|
查看次数: |
3036 次 |
最近记录: |