2013-04-24 150 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等)