2013-07-19 26 views
1

验证api密钥我已经使用ContainerRequestFilter来读取JSON有效内容并解析api密钥。我有以下方法。Jersey ContainerRequestFilter获取空实体流

public ContainerRequest filter(ContainerRequest request) { 

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    InputStream in = request.getEntityInputStream(); 
    try { 
     int read; 
     final byte[] data = new byte[2048]; 
     while ((read = in.read(data)) != -1) 
      out.write(data, 0, read); 

     byte[] requestEntity = out.toByteArray(); 

     request.setEntityInputStream(new ByteArrayInputStream(requestEntity)); 

     if (!validate(new String(data))) { 
      throw new WebApplicationException(401); 
     } 

     return request; 
    } catch (IOException ex) { 
     throw new WebApplicationException(401); 
    } 
} 

但是,数据总是空白/空白。如果没有过滤器,有效负载将达到资源类,并且工作得很好。任何线索为什么有效载荷是空的?我正在使用Firefox的REST客户端在Body中使用JSON进行测试。

回答

0

我假设你想,因为你可以得到一个无效的JSON(如果你的有效载荷是足够大),第二种情况下调用

validate(new String(requestEntity)) 

代替

validate(new String(data)) 

而且你可能要考虑使用MessageBodyReaders读你的实体,为您提供:

public ContainerRequest filter(ContainerRequest request) { 
    // Buffer 
    InputStream in = request.getEntityInputStream(); 
    if (in.getClass() != ByteArrayInputStream.class) { 
     // Buffer input 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     try { 
      ReaderWriter.writeTo(in, baos); 
     } catch (IOException ex) { 
      throw new ContainerException(ex); 
     } 
     in = new ByteArrayInputStream(baos.toByteArray()); 
     request.setEntityInputStream(in); 
    } 

    // Read entity as a string. 
    final String entity = request.getEntity(String.class); 

    if (!validate(entity) { 
     throw new WebApplicationException(401); 
    } 

    // Reset buffer 
    ByteArrayInputStream bais = (ByteArrayInputStream)in; 
    bais.reset(); 

    return request; 
} 
+0

感谢您的回复。应用修复,但仍然没有得到身体。但是,我已经用LogginFilter替换了我的过滤器,并且在打印标题时不会打印正文。在LoggingFilter代码中if(in.available()> 0)没有通过暗示实体流为空的条件时,我可以通过'sudo tcpdump -i lo0 -A port 8080'来看到有效载荷。不知道我在这里错过了什么。 – user1516100

+0

正是我面临的。 'in.available'给-1。 @ user1516100:您是否找到任何解决方案? –

0

我能想到的唯一的事情就是,在某种程度上,正在读输入流的过滤器得到ContainerRequest前。是否还有其他类仍然在数据中读取,或者您的设置是否配置错误,以便资源类在您的过滤器之前正在读取输入流?

相关问题