解决以前没有版本化的API版本控制问题,我遇到了一个问题:我在同一个网址上设置了两个资源:
@Path("/api/foo/")
public class FooResourceOne {
@GET
public Response getFoo () {
return Response.ok("Hello from One").build();
}
}
@Path("/api/foo/")
@Consumes("application/vnd.example.v2+json")
public class FooResourceTwo {
@GET
public Response getFoo () {
return Response.ok("Hello from Two").build();
}
}
问题是,如果您发送带有Content-Type
标头的GET请求(例如Content-Type: application/json
),则会转到FooResourceOne
进行处理。如果您指定Content-Type: application/vnd.example.v2+json
,则会正确转到FooResourceTwo
。这一切都很好。
但是,如果您根本没有指定Content-Type标头,那么它会转到FooResourceTwo
,这是不正确的?
没有@Consumes
注释意味着"接受任何",但似乎"任何"不包括"未指定"?或者更确切地说,#34;未指定"意味着由任何人处理(负载排序很重要)?
有没有办法指定FooResourceOne
是在没有给出Content-Type标题时应该响应的资源?
答案 0 :(得分:0)
我设法解决了一个不能解决根本问题的解决方法,但至少可以缓解症状。 Resteasy Filter
和PreProcessInterceptor
类能够检测到没有Content-Type
标头的请求何时进入,但除了抛出错误之外,它无法对其执行任何操作。因此,我的解决方法是FooResourceTwo
首先检查并查看是否没有标题集:
@Path("/api/foo/")
public class FooResourceOne {
@GET
public Response getFoo () {
return Response.ok("Hello from One").build();
}
}
@Path("/api/foo/")
@Consumes("application/vnd.example.v2+json")
public class FooResourceTwo {
@Inject
private FooResourceOne oldResource;
@GET
public Response getFoo (@Context HttpServletRequest request) {
if (request.getHeader("content-type") == null) {
// No, no, Resteasy; go this way...
return oldResource.getFoo();
}
return Response.ok("Hello from Two").build();
}
}