Управление сервисом Xpage REST и сервисный компонент

Я пытаюсь реализовать службу REST с помощью XPage REST Service Control. Я выбрал «customRESTService».

Я хотел бы выдать JSON при запросе этой службы. Я могу писать логику на Java Script на стороне сервера.

Но я заметил, что этот customRESTService также поддерживает «serviceBean», что означает, что я могу написать всю логику на чистом JAVA.

Я дал ниже код bean. Я также объявил это в Faces-config.xml. Но он выдает исключение при рендеринге. Кто-нибудь использовал «serviceBean» в customRESTService?

Я ценю любую помощь! Спасибо!!

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

person user2315796    schedule 24.04.2013    source источник
comment
как выглядит объявление в Faces-config.xml этого класса. Можете дать код??   -  person Frank van der Linden    schedule 24.04.2013
comment
Это когда-нибудь решалось?   -  person stwissel    schedule 15.05.2014


Ответы (2)


Вам нужно изменить код на:

public class GetApproverJSON{ ...}

to:

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 и т.д.) из объекта запроса

person stwissel    schedule 25.04.2013

Я никогда раньше не использовал сервисный компонент, обычно я создаю свой собственный парсер со статическим методом doGet, очень похожим на ваш, и в свойстве doGet пользовательской службы REST делаю вызов статического метода doGet, который я создаю. Но я думаю (я, вероятно, ошибаюсь в этом отношении), если вы используете компонент службы, это должен быть целый сервлет, как если бы вы написали свою собственную фактическую службу 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, которую я создал для демонстрации JQuery FullCalendar. Хотя ни один из методов не является статическим (мне нужно отслеживать пару свойств), вы должны уловить основную идею. Но все начинается с вызова метода writeJson(). Это вызывается в этом пользовательском элементе управления. .

Эти примеры должны помочь вам создать собственный анализатор JSON и отправить этот JSON обратно в ваше приложение.

person keithstric    schedule 24.04.2013