Xpage REST service control and service bean
Я пытаюсь реализовать службу REST с помощью XPage REST Service Control. Я выбрал "customRESTService".
Я хотел бы испустить JSON, когда запрашивается этот сервис. Я могу написать логику на стороне сервера Java Script.
Но я заметил, что этот customRESTService также поддерживает "serviceBean", то есть я могу писать всю логику на чистом JAVA.
Я дал ниже код боба. Я объявил об этом и в face-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
2 ответа
Вам нужно изменить свой код на:
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 и т. Д.) Из объекта запроса.
Я никогда раньше не использовал служебный компонент, обычно я создаю свой собственный синтаксический анализатор со статическим методом 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 и отправить его обратно в ваше приложение.