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

标签 java rest get jersey jax-rs

我一直在 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:已检测到资源和/或提供程序类的以下错误和警告: 严重:产生媒体类型冲突。资源方法 public java.lang.String StubImpl.getString(int,int) 和 public java.lang.String StubImpl.getSize(int,javax.ws.rs.core.HttpHeaders) 可以产生相同的媒体类型

据我所知,@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/

相关文章:

rest - 如何从元数据中查找 OData 版本

json - 从 Angular 2 中的 json 文件获取数据

javascript - 在 GET 之前重新发送 OPTIONS 方法

java - 从 Servlet 向 JSP 发送信息

java - 通过将我们的模型类的实例传递给可比对象和将包装器传递给可比对象来使用可比对象有什么区别?

java - 从 String 中检索值的最快方法是什么?

Java Spring : Real-time status update to the client over REST API

java - 如何在 Java 中将 PublicKey 转换为 JSON?

java - 使用 rest web 服务的 spring security 登录

javascript - 从谷歌可视化类别包装器控件中获取实际值