2016-10-25 3 views
3

私はBeanに結びついているXpageにカスタムrestサービスを書いています。 Xpageは:beanを使ってcustomRestServiceでビューを返す最速の方法

<xe:restService 
    id="restServiceCustom" 
    pathInfo="custom" 
    ignoreRequestParams="false" 
    state="false" 
    preventDojoStore="true"> 
    <xe:this.service> 
     <xe:customRestService 
      contentType="application/json" 
      serviceBean="XXXX.PCServiceBean"> 
     </xe:customRestService> 
    </xe:this.service> 
</xe:restService> 

私は一緒にネットの周りのいくつかの優れた投稿から私のJavaエージェントをcobbledです。私はGETを始めたばかりです。私のコードが実行されますが、私はかなり遅い(私のdevサーバー上)です。私はできるだけ早くそれを作りたい。私はViewEntryCollectionを使用しています。私はストリーミングしていると想定している各レコードで "フラッシング"しています。

私は自分の「[」をコードに入れているので、これをやっている他の人の例は見たことがないので、何か正しいことをしていないと仮定します。

ご意見をいただければ幸いです。

package com.XXXXX.bean; 

import java.io.IOException; 
import java.io.Writer; 
import java.util.Vector; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.openntf.domino.Database; 
import org.openntf.domino.Session; 
import org.openntf.domino.View; 
import org.openntf.domino.ViewEntry; 
import org.openntf.domino.ViewEntryCollection; 
import org.openntf.domino.utils.Factory; 

import com.ibm.commons.util.io.json.JsonException; 
import com.ibm.commons.util.io.json.util.JsonWriter; 
import com.ibm.domino.services.ServiceException; 
import com.ibm.domino.services.rest.RestServiceEngine; 
import com.ibm.xsp.extlib.component.rest.CustomService; 
import com.ibm.xsp.extlib.component.rest.CustomServiceBean; 

public class PCServiceBean extends CustomServiceBean { 

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

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

      String method = request.getMethod(); 
      if (method.equals("GET")) { 
       this.doGet(request, response); 
      } else if (method.equals("POST")) { 
       this.doPost(request, response); 
      } else if (method.equals("PUT")) { 
       this.doPut(request, response); 
      } else if (method.equals("DELETE")) { 
       this.doDelete(request, response); 
      } 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 

    } 

    private void doDelete(HttpServletRequest request, HttpServletResponse response) { 
     // TODO Auto-generated method stub 

    } 

    private void doPut(HttpServletRequest request, HttpServletResponse response) { 
     // TODO Auto-generated method stub 

    } 

    private void doPost(HttpServletRequest request, HttpServletResponse response) { 
     // TODO Auto-generated method stub 

    } 

    private void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, JsonException { 

     Session session = Factory.getSession(); 
     Database DB = session.getDatabase(session.getCurrentDatabase().getServer(), "scoApps\\PC\\PCData.nsf"); 
     View pcView = DB.getView("viewAllByStatus"); 

     int i = 1; 

     Writer out = response.getWriter(); 
     JsonWriter writer = new JsonWriter(out, false); 

     writer.out("["); 

     ViewEntryCollection vec = pcView.getAllEntries(); 
     int count = vec.getCount(); 

     for (ViewEntry entry : vec) { 

      Vector<?> columnValues = entry.getColumnValues(); 

      writer.startObject(); 

      writer.startProperty("unid"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(1))); 
      writer.endProperty(); 

      writer.startProperty("status"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(0))); 
      writer.endProperty(); 

      writer.startProperty("assetTag"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(2))); 
      writer.endProperty(); 

      writer.startProperty("serialNumber"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(3))); 
      writer.endProperty(); 

      writer.startProperty("model"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(4))); 
      writer.endProperty(); 

      writer.startProperty("currentLocation"); 
      writer.outStringLiteral(String.valueOf(columnValues.get(5))); 
      writer.endProperty(); 


      writer.endObject(); 

      if (i != count) { 
       i = i + 1; 
       writer.out(","); 
       writer.flush(); 
      } 

     } 
     writer.out("]"); 
     writer.flush(); 
    } 
} 
+0

クヌートの答えがかわいいです。また、必要に応じて、未使用のメソッド(「GET」以外のリクエストなど)を削除することもできます。また、他のサービスと互換性を持たせたい場合は、「処理されていないリクエスト」も用意する必要があります。ご質問がある場合は私に打ちなさい。 –

答えて

5
"["(アウト(そしてそれはJsonWriterの

  • startArray()とendArray()の代わりにアウトのを) "]" を使用し

    JsonWriter writer = new JsonWriter(out, false); 
    
        writer.startArray(); 
    
        ViewEntryCollection vec = pcView.getAllEntries(); 
        int count = vec.getCount(); 
    
        for (ViewEntry entry : vec) { 
    
         Vector<?> columnValues = entry.getColumnValues(); 
    
         writer.startArrayItem(); 
         writer.startObject(); 
    
         writer.startProperty("unid"); 
         writer.outStringLiteral(String.valueOf(columnValues.get(1))); 
         writer.endProperty(); 
    
         ... 
    
         writer.endObject(); 
         writer.endArrayItem(); 
        } 
        writer.endArray(); 
        writer.flush(); 
    

    にあなたのコードを変更

  • outArrayItem()およびendArrayItem()out( "、")およびflush()の代わりに

JSONレスポンス文字列を使用すると、trueにJsonWriterのコンパクトオプション設定した場合は短くなる:

JsonWriter writer = new JsonWriter(out, true); 
2

を、私は二つの問題を参照してください。

まず、ViewNavigatorを使用します。パフォーマンスの向上についてはここで説明します。

https://www.mindoo.com/web/blog.nsf/dx/17.01.2013085308KLEB9S.htm

セカンド - 事前にJSONを準備します。これは、Domino文書からJSONデータを取得するために不要なコード(および処理時間)を避けるための非常に優れた手法です。

https://quintessens.wordpress.com/2015/09/05/working-with-json-in-your-xpages-application/

関連する問題