我有一个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

我做了一些研究,建议不能在同一请求上调用getReadergetInputStream。因此,似乎已经调用了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"
}

09-27 00:33