在处理以前没有版本化的API的版本问题时,我遇到了一个问题:我在同一个URL端点上设置了两个资源:
@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标头(例如Content-Type: application/json)的GET请求,它将转到FooResourceOne进行处理。如果您指定Content-Type: application/vnd.example.v2+json,它将正确地转到FooResourceTwo。这一切都很好。
但是,如果您根本不指定Content-Type头,它将转到FooResourceTwo,这是不正确的吗?
没有@Consumes注解意味着“接受任何”,但“任何”似乎不包括“未指定”?或者更确切地说,“未指定”意味着由任何人处理(并且加载顺序很重要)?
有没有一种方法可以指定FooResourceOne是在根本没有内容类型标头的情况下应该响应的资源?
发布于 2016-08-15 21:25:03
我设法解决了一个不能解决根本问题的办法,但至少减轻了症状。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();
}
}https://stackoverflow.com/questions/38925572
复制相似问题