Java API资源排序

时间:2016-08-12 19:54:04

标签: java resteasy

解决以前没有版本化的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标题时应该响应的资源?

1 个答案:

答案 0 :(得分:0)

我设法解决了一个不能解决根本问题的解决方法,但至少可以缓解症状。 Resteasy FilterPreProcessInterceptor类能够检测到没有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();
    }
}