为了处理内容类型的不同版本,我试图使用"Accept*"标头的接受参数(RFC 2616).
Accept: application/vnd.mycompany.mytype;version=2 , application/vnd.mycompany.mytype;version=1;q=0.1
Run Code Online (Sandbox Code Playgroud)
问题是Jax-RS注释不支持Accept-parameters ...
@GET
@Produces("application/vnd.test;version=1")
public Response test1() {
return Response.ok("Version 1", "application/vnd.test").build();
}
@GET
@Produces("application/vnd.test;version=2")
public Response test2() {
return Response.ok("Version 2", "application/vnd.test").build();
}
Run Code Online (Sandbox Code Playgroud)
导致媒体类型冲突异常:
Producing media type conflict. The resource methods public javax.ws.rs.core.Response test.resources.TestResource.test2() and public javax.ws.rs.core.Response test.resources.TestResource.test1() can produce the same media type
Run Code Online (Sandbox Code Playgroud)
也许,这个例外只与我的JAX-RS框架(Jersey)有关,但我担心这是由于JSR311没有明确的接受参数.
到目前为止,我正在使用内容类型,其中包含其名称中的版本,但我发现这个解决方案非常流畅.
@GET
@Produces("application/vnd.test-v1")
public Response test() {
return Response.ok("Version 1", "application/vnd.test-v1").build();
}
Run Code Online (Sandbox Code Playgroud)
您对如何处理接受参数有任何想法吗?
编辑
我想我还不够清楚.我想自动将请求路由到特定方法.这些方法是版本化的,并且对应于返回的内容类型的特定版本.JAX-RS当前实现阻止我使用accept-parameters来路由请求(到相应的方法).
greenkode建议我version在调度方法(使用@HeaderParam("Accept"))中管理accept-parameter .该解决方案最终将重写内容解析逻辑,该逻辑嵌入框架中(并在JSR 311中描述).
如何使用JAX-RS的accept-parameter和content-negociation逻辑呢?
也许解决方案是使用另一个框架(我只使用Jersey …
我一直在使用YUI Library来开发网站.YUI 3于9月问世.
我仍然不相信我是否必须为迁移做好准备.
第二版有什么优势?
你最近参与过这样的迁移吗?