1

XPage REST Service Control を使用して 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 を使用する場合は、パーサー部分だけでなく、独自の実際の REST サービスを作成した場合と同様に、サーブレット全体である必要があると思います (この点についてはおそらく間違っています)。

私はかなりの数のパーサーを作成し、マップのリストを見つけました:

一覧>

通常、初期データを構築するための最良の方法です。次に、リストをループして JSON を構築します。拡張ライブラリには、JSON オブジェクトの作成を非常に簡単にする JsonWriter というクラスがあります。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 に答える