@GET可以为JAX-RS实现定义Consumes Content-Type吗?

时间:2013-05-12 07:39:32

标签: java rest get jersey jax-rs

我一直在JAXRS上尝试一些示例(本例中使用Jersey)。以下是我的示例存根实现:

    @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方法没有正文)。

是否需要现有行为?

提前致谢

3 个答案:

答案 0 :(得分:7)

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

如果你没有设置@Consumes(MediaType.APPLICATION_JSON),泽西岛怎么决定在GET请求进来时调用哪个方法?

两种方法都在同一路径上回答GET请求,接受任何媒体类型,并生成相同的媒体类型。所以我的猜测是,当GET请求进入此路径时,Jersey无法决定(除了随机)调用哪个方法,因此拒绝启动。

@Consumes注释使得当请求具有JSON主体(即从不)时调用getSize,而在所有其他情况下(即始终)调用其他方法。

答案 1 :(得分:0)

您没有为getString和getSize设置路径。这是根本原因。

   @Path("stubservice")
public class StubImpl
    @GET
    @Path("getstring")   //the full path will be /stubservice/getstring
    @Produces(MediaType.APPLICATION_JSON)
    public String getString(@QueryParam("first")
    int first, @QueryParam("second")
    int second)
    {
        return "first: " + first + " second: " + second;
    }

    @GET
    @Path("getsize")    //the full path will be /stubservice/getsize
    @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");
    }
}

答案 2 :(得分:0)

从初始化时出现的错误开始:

您收到错误的原因是@Stony Zhang建议。删除@Consumes时,两个方法实际上都指向相同的路径,而JAX-RS无法区分两个RESTFul端点。

GET请求不需要@Consumes(MediaType.APPLICATION_JSON)。来自@Consumes oracle documentation 的oracle文档 @Consumes注释用于指定资源可以从客户端接受或使用哪些MIME媒体类型的表示。这意味着您确实不需要使用json作为端点将接受的媒体类型。你可以使用@Consumes(“multipart / related”)或@Consumes({“text / plain,text / html”})等等,具体取决于你发送给服务器的MIME类型。

你说@GET没有正文你也是对的。它放在@Path annontation中,是来自url的查询字符串输入。它就像

`@GET

 @Path("/stubservice/{id}")`