我有一个Jersey Web服务,我需要解析一些与请求一起发送的json数据。
@POST
@Path ("/authenticate")
@Produces (MediaType.APPLICATION_JSON)
public Response authenticate (@Context HttpServletRequest request)
{
try {
StringBuffer json = new StringBuffer ();
BufferedReader reader = request.getReader();
int line;
while ((line = reader.readLine()) != null)
{
json.append(line);
}
System.out.prinln (json);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return Response.ok().entity(json).build();
}//end authenticate method
该服务生成以下异常:
java.lang.IllegalStateException: getInputStream() has already been called for this request
我做了一些研究,建议不能在同一请求上调用
getReader
和getInputStream
。因此,似乎已经调用了getInputStream
实例。如果我没有明确调用它怎么办?为了解决此问题,我改用了getInputStream
方法 try {
ServletInputStream reader = request.getInputStream();
int line;
while ((line = reader.read()) != -1)
{
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return Response.ok().entity().build();
通过这种方法,如何使用字节的int来获取json?
最佳答案
好像您缺少@Consumes
注释。您意识到自己可以拥有一种方法;
@POST
@Path ("/authenticate")
@Consumes (MediaType.APPLICATION_JSON)
@Produces (MediaType.APPLICATION_JSON)
public Response authenticate (String entity) {
//entity contains the posted content
}
无需自己阅读流?如果您有一个表示使用的JSON的bean,则可以将其添加为param方法,并且jersey将自动为您解析它。
@POST
@Path ("/authenticate")
@Consumes (MediaType.APPLICATION_JSON)
@Produces (MediaType.APPLICATION_JSON)
public Response authenticate (AuthBean auth) {
//auth bean contains the parsed JSON
}
class AuthBean {
private String username;
private String password;
// getters/setters
}
示例帖子;
{
"username" : "[email protected]",
"password" : "super s3cret"
}