2013-04-24 115 views
1

我正在嘗試使用XPage REST服務控件實現REST服務。我選擇了「customRESTService」。Xpage REST服務控制和服務bean

我想在請求此服務時發出JSON。我可以在服務器端Java腳本中編寫邏輯。

但我注意到這個customRESTService還支持「serviceBean」,這意味着我可以在純JAVA中編寫整個邏輯。

我給出了下面的bean代碼。我也在faces-config.xml中聲明瞭它。但它在渲染時拋出異常。有沒有人在customRESTService中使用「serviceBean」?

我很感激任何幫助!謝謝!!

public class GetApproverJSON{ 
public GetApproverJSON(){ 
    System.out.println("Instantiating Bean"); 
} 

public String doGet() throws NotesException{ 

    JSONObject mainObj = new JSONObject();; 
    JSONObject itemObj; 

    try{ 
     mainObj.put("label", "name"); 
     mainObj.put("identifier", "abbr"); 

     itemObj = new JSONObject(); 
     itemObj.put("name", ""); 
     itemObj.put("abbr", ""); 

     mainObj.accumulate("items", itemObj); 

     return mainObj.toString(); 
    }catch(Exception e){ 
     System.out.println("Exception occured while generating JSON "); 
     e.printStackTrace(); 
     return mainObj.toString(); 
    }finally{ 

    } 
} 

錯誤:

com.ibm.domino.services.ServiceException: Error while rendering service 
at com.ibm.xsp.extlib.component.rest.CustomService$ScriptServiceEngine.renderService(CustomService.java:304) 
at com.ibm.domino.services.HttpServiceEngine.processRequest(HttpServiceEngine.java:167) 
at com.ibm.xsp.extlib.component.rest.UIBaseRestService._processAjaxRequest(UIBaseRestService.java:252) 
at com.ibm.xsp.extlib.component.rest.UIBaseRestService.processAjaxRequest(UIBaseRestService.java:229) 
at com.ibm.xsp.util.AjaxUtilEx.renderAjaxPartialLifecycle(AjaxUtilEx.java:206) 
at com.ibm.xsp.webapp.FacesServletEx.renderAjaxPartial(FacesServletEx.java:221) 
at com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:166) 
at com.ibm.xsp.webapp.FacesServlet.service(FacesServlet.java:160) 
at com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:137) 
at com.ibm.xsp.webapp.DesignerFacesServlet.service(DesignerFacesServlet.java:103) 
at com.ibm.designer.runtime.domino.adapter.ComponentModule.invokeServlet(ComponentModule.java:576) 
at com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet(NSFComponentModule.java:1267) 
at com.ibm.designer.runtime.domino.adapter.ComponentModule$AdapterInvoker.invokeServlet(ComponentModule.java:847) 
at com.ibm.designer.runtime.domino.adapter.ComponentModule$ServletInvoker.doService(ComponentModule.java:796) 
at com.ibm.designer.runtime.domino.adapter.ComponentModule.doService(ComponentModule.java:565) 
at com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService(NSFComponentModule.java:1251) 
at com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:598) 
at com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:421) 
at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:341) 
at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:297) 
at com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:272) 
     Caused by: com.ibm.xsp.FacesExceptionEx: Bean getApproverJSON is not a CustomServiceBean 
at com.ibm.xsp.extlib.component.rest.CustomService.findBeanInstance(CustomService.java:226) 
at com.ibm.xsp.extlib.component.rest.CustomService$ScriptServiceEngine.renderService(CustomService.java:255) 
... 20 more 
+0

這個類的faces-config.xml中的聲明是怎麼樣的。你能提供代碼嗎? – 2013-04-24 14:12:49

+0

它解決了嗎? – stwissel 2013-06-12 12:56:57

+0

這有沒有解決? – stwissel 2014-05-15 05:19:45

回答

0

我從來沒有使用的服務bean之前,我通常會創建自己的解析器使用靜態doGet方法非常相似,你和自定義REST的財產的doGet服務調用我創建的靜態doGet方法。但是我認爲(如果你使用服務bean,它必須是整個servlet,就好像你編寫了你自己的實際REST服務一樣),而不僅僅是解析器部分。

我創建了不少的解析器,並已發現的地圖列表:

名單>

通常是建立初始數據的最佳方法。然後我遍歷列表來構建我的JSON。在擴展庫中有一個名爲JsonWriter的類,這使得構建JSON對象變得非常容易。使用JsonWriter這樣的:

StringWriter sw = new StringWriter(); 
JsonWriter jw = new JsonWriter(sw); 
jw.startObject(); 
jw.startProperty("SomeProperty"); 
jw.outStringLiteral("SomeValue"); 
jw.endProperty(); 
jw.endObject(); 
return sw.toString(); 

對於一個完整的例子,你可以看看的REST service I built for my JQuery FullCalendar demo。雖然沒有一種方法是靜態的(我需要跟蹤幾個屬性),但您應該瞭解基本思路。但是關於writeJson()方法的一個調用將會徹底解決。這在this custom control中被調用。

這些示例應該讓您繼續構建自己的自定義JSON解析器並將該JSON發送回您的應用程序。

1

您需要更改您的代碼:

public class GetApproverJSON{ ...} 

到:

public class GetApproverJSON extends CustomServiceBean { 

    @Override 
    public void renderService(CustomService service, RestServiceEngine engine) throws ServiceException { 
     HttpServletRequest request = engine.getHttpRequest(); 
     HttpServletResponse response = engine.getHttpResponse(); 

     response.setHeader("Content-Type", "application/json; charset=UTF-8"); 

     // Here goes your code, get the response writer or stream 

    } 

因爲這是REST服務期待的接口。您需要實施renderService。你可以從請求對象中獲取方法(GET,POST等)