1

我正在尝试使用 XPage REST 服务控制来实现 REST 服务。我选择了“customRESTService”。

我想在请求此服务时发出 JSON。我可以在服务器端 Java Script 中编写逻辑。

但我注意到这个 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
4

2 回答 2

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 等)

于 2013-04-25T01:57:47.953 回答
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();

有关完整示例,您可以查看我为 JQuery FullCalendar 演示构建的 REST 服务。虽然这些方法都不是静态的(我需要跟踪几个属性),但您应该了解基本概念。但是启动整个过程的是对 writeJson() 方法的调用。这是在此自定义控件中调用的。

这些示例应该让您继续构建自己的自定义 JSON 解析器并将该 JSON 发送回您的应用程序。

于 2013-04-24T15:21:55.363 回答