我一直在 JAXRS 上尝试一些示例(在这个例子中使用 Jersey)。以下是我拥有的示例 stub 实现:

    @Path("stubservice")
public class StubImpl
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getString(@QueryParam("first")
    int first, @QueryParam("second")
    int second)
    {
        return "first: " + first + " second: " + second;
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public String getSize(@QueryParam("size")
                              int size,
                              @Context
                              HttpHeaders headers)
    {
        Gson gson = new Gson();
        return gson.toJson("something else");
    }
}

如果 getSize 方法的定义中没有 @Consumes(MediaType.APPLICATION_JSON),这个类在初始化过程中就会出错。但是有了它, StubImpl 类可以正确初始化并根据传入请求的 Content-Type 是否为 application/json 来为请求提供服务。

初始化过程中发生错误:
SEVERE: The following errors and warnings have been detected with resource and/or provider classes: SEVERE: Producing media type conflict. The resource methods public java.lang.String StubImpl.getString(int,int) and public java.lang.String StubImpl.getSize(int,javax.ws.rs.core.HttpHeaders) can produce the same media type
据我了解,@GET 请求永远不需要 @Consumes(MediaType.APPLICATION_JSON),因为它适用于正文中的内容类型(并且 GET 方法没有正文)。

现有行为是否符合预期?

提前致谢

最佳答案

根本不是 JAX-RS 专家,所以这只是一个猜测。

如果不设置 @Consumes(MediaType.APPLICATION_JSON) ,Jersey 如何决定在 GET 请求到来时调用哪种方法?

这两种方法都响应 GET 请求,在同一路径上,接受任何媒体类型,并产生相同的媒体类型。所以我的猜测是当 GET 请求进入这条路径时,Jersey 无法决定(除了随机)调用哪个方法,因此拒绝启动。
@Consumes 注释使它在请求具有 JSON 主体(即从不)时调用 getSize,在所有其他情况下(即始终)调用其他方法。

关于java - @GET 可以为 JAX-RS 实现定义 Consumes Content-Type 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16505197/

10-10 07:27