我一直在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方法没有正文)。
是否需要现有行为?
提前致谢
答案 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}")`