2012-05-16 133 views
2

這工作得很好:元素CXF返回列表

@GET 
@Path("elements") 
public List<Element> getElements(@HeaderParam(SESSION_TOKEN) String token) { 
    try { 
     if (token != null) { 
      Session session = new Session(); 
      if (session.initWithToken(token)) { 
       ElementFacade sf = ElementFacade.getInstance(); 
       return sf.getElements(session.getUser()); 
      } 
     } 
    } catch (Throwable th) { 
     log.error("", th); 
    } 
    return new ArrayList<Element>(); 
} 

我得到一個非常漂亮的JSON數組對象。

現在的問題是我喜歡將我的數據作爲有效負載放入響應中,以便能夠設置標題和狀態,並將錯誤對象作爲有效負載返回。 但它不起作用。

@GET 
@Path("elements2") 
public Response getElements2(@HeaderParam(SESSION_TOKEN) String token) { 
    try { 
     if (token == null) { 
      return ResponseFactory.createResponse(401, 4007); 
     } 
     Session session = new Session(); 
     if (session.initWithToken(token)) { 
      ElementFacade sf = ElementFacade.getInstance(); 
      return Response.status(200) 
        .header(Endpoint.SESSION_TOKEN, session.getToken()) 
        .entity(sf.getElements(session.getUser())).build(); 
     } 
     return ResponseFactory.createResponse(403, 4006); 
    } catch (InvalidTokenException e) { 
     return ResponseFactory.createResponse(401, 4005); 
    } catch (SessionTimeoutException e) { 
     return ResponseFactory.createResponse(401, 4004); 
    } catch (Throwable th) { 
     log.error("", th); 
     return ResponseFactory.createResponse(500, 5099); 
    } 
} 

麥16,2012下午7時○○分35秒org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage Warnung:沒有消息體的作家已經發現了響應類的ArrayList。

如何使用與第二個函數中的第一個函數相同的現有功能?

我讀一些關於寫一個自己的MessageBodyWriter但在那類,我需要整個JSON寫入一個OutputStream,似乎是一個大量的工作和開銷...

在此先感謝

回答

1

這是所以該死的容易。但還沒有找到它的任何文檔中......

我嘗試了很多,然後baammm ...

@GET 
@Path("elements2") 
public Response getElements2(@HeaderParam(SESSION_TOKEN) String token) { 
     try { 
      if (token == null) { 
       return ResponseFactory.createResponse(401, 4007); 
      } 
      Session session = new Session(); 
      if (session.initWithToken(token)) { 
       ElementFacade sf = ElementFacade.getInstance(); 
       List<Element> list = sf.getElements(session.getUser()); 
       return Response.status(200) 
         .header(Endpoint.SESSION_TOKEN, session.getToken()) 
         .entity(new GenericEntity<List<Element>>(list) {}).build(); 
      } 
      return ResponseFactory.createResponse(403, 4006); 
     } catch (InvalidTokenException e) { 
      return ResponseFactory.createResponse(401, 4005); 
     } catch (SessionTimeoutException e) { 
      return ResponseFactory.createResponse(401, 4004); 
     } catch (Throwable th) { 
      log.error("", th); 
      return ResponseFactory.createResponse(500, 5099); 
     } 
} 

這是它...你只需要創建一個GenericEntity ...

+0

而不是所有這些,你可以在類級別有一個MessageContext對象並從那裏獲取HttpServletResponse對象。然後設置你想要的任何狀態碼,然後返回你的列表......狀態碼和標題將會一直出現 – Sikorski