2013-07-19 52 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前。是否還有其他類仍然在數據中讀取,或者您的設置是否配置錯誤,以便資源類在您的過濾器之前正在讀取輸入流?

相關問題