首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java API资源排序

Java API资源排序
EN

Stack Overflow用户
提问于 2016-08-13 03:54:04
回答 1查看 112关注 0票数 2

在处理以前没有版本化的API的版本问题时,我遇到了一个问题:我在同一个URL端点上设置了两个资源:

代码语言:javascript
复制
@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是在根本没有内容类型标头的情况下应该响应的资源?

EN

回答 1

Stack Overflow用户

发布于 2016-08-15 21:25:03

我设法解决了一个不能解决根本问题的办法,但至少减轻了症状。Resteasy FilterPreProcessInterceptor类能够检测到没有Content-Type头的请求何时传入,但是除了抛出一个错误之外,无法对此做任何事情。因此,我的解决方法是让FooResourceTwo首先检查是否没有头文件集:

代码语言:javascript
复制
@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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38925572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档