Xpages SBT ‹xe:restJsonData› и java.util.ArrayList несовместимы с com.ibm.commons.util.io.json.JsonJavaObject

Я пытаюсь использовать функциональность конечной точки в SBT в XPages с другой службой отдыха (в отличие от тех, что в примерах). Аутентификация работает после нескольких настроек (спасибо, Сердар!), но я хотел имитировать пример StackOverflow и использовать ответ через <xe:restJsonData> и повторить контроль.

Используя пример SO в качестве отправной точки, если я изменю параметры, чтобы они соответствовали моему сервису, я получаю эту ошибку...

Error while reading the JSON stream java.util.ArrayList incompatible with com.ibm.commons.util.io.json.JsonJavaObject

Я предполагаю, что это как-то связано с splitpath, поскольку полученный json не имеет общего родителя как такового. Выглядит примерно так (отредактировано)...

[ { "user_id": 1688810, "space_id": null, "type": "user", "title": [ "Workflow Architect" ], "external_id": null, "last_seen_on": "2014-07-21 06:42:03", "name": "XXX XXX" }, { "user_id": 1998697, "name": "YYY YYY", "rights": [ "view" ], "external_id": null, "space_id": null, "title": [ "Owner" ], "org_id": null, "country": "United States", "type": "user", "last_seen_on": "2014-07-20 16:52:03", "location": [ "Amarillo" ] } ] Я пробовал разделить путь на пустой или "/", но получаю ту же ошибку. Я знаю, что данные возвращаются, так как ввод вычисленного значения @Endpoint("podio").xhrGet("/contact/").getData(); показывает, что все в порядке (необработанное)

Любые идеи, как я могу разделить этот результат, чтобы он работал, или это принципиально невозможно с этим объектом, поскольку json сложен? Спасибо!

Полная трассировка стека...

com.ibm.xsp.FacesExceptionEx: Error while reading the JSON stream
at com.ibm.xsp.extlib.sbt.generic.GenericRestJsonDataSource$JsonAccessor.loadBlock(GenericRestJsonDataSource.java:137)
at com.ibm.xsp.extlib.model.DataBlockAccessor.findBlockByIndex(DataBlockAccessor.java:344)
at com.ibm.xsp.extlib.model.DataBlockAccessor.prefetchData(DataBlockAccessor.java:292)
at com.ibm.xsp.extlib.model.DataAccessorModel.getRowCount(DataAccessorModel.java:93)
at com.ibm.xsp.model.TabularDataModel.isRowAvailable(TabularDataModel.java:96)
at com.ibm.xsp.extlib.model.DataAccessorModel.isRowAvailable(DataAccessorModel.java:69)
at com.ibm.xsp.component.UIDataIterator.isRowAvailable(UIDataIterator.java:523)
at com.ibm.xsp.component.UIDataIterator.pushVars(UIDataIterator.java:504)
at com.ibm.xsp.component.UIDataIterator.setRowIndex(UIDataIterator.java:469)
at com.ibm.xsp.renderkit.html_extended.IteratorRenderer.encodeRows(IteratorRenderer.java:62)
at com.ibm.xsp.renderkit.html_extended.IteratorRenderer.encodeChildren(IteratorRenderer.java:55)
at com.ibm.xsp.renderkit.ReadOnlyAdapterRenderer.encodeChildren(ReadOnlyAdapterRenderer.java:162)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:979)
at com.ibm.xsp.component.UIDataIterator.encodeChildren(UIDataIterator.java:725)
at com.ibm.xsp.util.FacesUtil.renderComponent(FacesUtil.java:844)
at com.ibm.xsp.util.FacesUtil.renderComponent(FacesUtil.java:853)
at com.ibm.xsp.util.FacesUtil.renderComponent(FacesUtil.java:853)
at com.ibm.xsp.util.FacesUtil.renderComponent(FacesUtil.java:853)
at com.ibm.xsp.util.FacesUtil.renderComponent(FacesUtil.java:853)
at com.ibm.xsp.component.UIViewRootEx._renderView(UIViewRootEx.java:1317)
at com.ibm.xsp.component.UIViewRootEx.renderView(UIViewRootEx.java:1255)
at com.ibm.xsp.application.ViewHandlerExImpl.doRender(ViewHandlerExImpl.java:651)
at com.ibm.xsp.application.ViewHandlerExImpl._renderView(ViewHandlerExImpl.java:321)
at com.ibm.xsp.application.ViewHandlerExImpl.renderView(ViewHandlerExImpl.java:336)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:103)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:210)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:120)
at com.ibm.xsp.controller.FacesControllerImpl.render(FacesControllerImpl.java:270)
at com.ibm.xsp.webapp.FacesServlet.serviceView(FacesServlet.java:261)
at com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:157)
at com.ibm.xsp.webapp.FacesServlet.service(FacesServlet.java:160)
at com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:138)
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:1315)
at com.ibm.designer.runtime.domino.adapter.ComponentModule$AdapterInvoker.invokeServlet(ComponentModule.java:853)
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:1299)
at com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:662)
at com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:482)
at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:350)
at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:306)
at com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:272)
Caused by: java.lang.ClassCastException: java.util.ArrayList incompatible with com.ibm.commons.util.io.json.JsonJavaObject
at com.ibm.xsp.extlib.sbt.generic.GenericRestJsonDataSource$JsonAccessor.loadBlock(GenericRestJsonDataSource.java:121)
... 43 more'

person Martin Holland    schedule 21.07.2014    source источник
comment
Можете ли вы добавить полный стек Java для этой конкретной ошибки? (из журналов под рабочей областью)   -  person Serdar Basegmez    schedule 21.07.2014
comment
splitPath — это область XPath, если ваши элементы разделены отдельными узлами. В вашем случае он должен быть пустым.   -  person Serdar Basegmez    schedule 21.07.2014
comment
Метод LoadBlock GenericRestJsonDataSource имеет этот } catch(Exception ex) { throw new FacesExceptionEx(ex,"Error while reading the JSON stream"); }, из-за чего трудно определить, в чем заключается настоящая ошибка. У меня есть исходный код в eclipse, и я хочу добавить дополнительную обработку исключений для регистрации/изменения и т. д., но я не знаю, как его снова собрать и вернуть в домино.   -  person Martin Holland    schedule 21.07.2014
comment
Ага, теперь вспомнил :)   -  person Serdar Basegmez    schedule 21.07.2014


Ответы (1)


Я столкнулся с той же проблемой раньше. Это неспособность GenericRestJsonDataSource. Если удаленная служба предоставляет массив вместо объекта, данные клиентской службы возвращают ArrayList из JsonJavaObject.

Однако он ожидает JsonJavaObject, который содержит ArrayList из JsonJavaObject.

Вот почему в предыдущем примере BaseCamp (в связанном вопросе) я разработал дополнительный компонент Java, который извлекает данные и поддерживает свои собственные структуры списка. Это также очень помогло мне при кэшировании.

Ваши данные должны быть в таком формате:

{
  items: [
     {
       prop: value, ....
     },
     {
       prop: value, ....
     }
  ]
}

Так же, как в примере с SO. В этом случае splitPath должно быть items.

На самом деле это легко исправить в классе. Класс доступа в GenericRestJsonDataSource следует изменить, чтобы проверить, является ли возвращаемый элемент ArrayList. Однако в то время это казалось более удобным методом разработки моего собственного Service bean.

person Serdar Basegmez    schedule 21.07.2014
comment
Спасибо! Когда вы говорите о простом исправлении, вы имеете в виду исправление и самостоятельную сборку SBT? Если да, то знаете ли вы какие-либо инструкции о том, как это сделать? Я хотел бы иметь возможность редактировать его в eclipse, создавать, создавать новый сайт обновлений и загружать обратно на мой сервер разработки. Я могу отправить новую проблему в проект github, но было бы неплохо протестировать изменения самостоятельно. - person Martin Holland; 21.07.2014
comment
К вашему сведению, в конечном итоге я буду использовать подход, аналогичный вашему примеру basecamp, то есть доступ через bean-компоненты. Служба, которую я использую, в любом случае имеет собственный Java API, но точке входа нужны клиентские токены, поэтому для танцев все равно будет использоваться SBT. Было бы неплохо заставить ‹xe:restJsonData› работать, так как это отличный способ быстро заставить что-то работать в качестве демонстрации/доказательства концепции перед кодированием bean-компонентов. - person Martin Holland; 21.07.2014
comment
Мартин, основные библиотеки легко доступны благодаря Maven. Я думаю, что создание собственной среды разработки для xsp-плагинов не будет отличаться от процедуры настройки среды разработки для библиотеки расширений. Вы должны настроить Eclipse для работы с OSGi на XSP. Я работал над SBT.core, но не над плагинами XSP. Вы правы насчет компонента restJsonData. Это очень полезно для демонстрации. - person Serdar Basegmez; 21.07.2014
comment
NB: мне удалось исправить GenericRestJsonDataSource в моей собственной сборке. У меня есть собственный форк здесь github.com/MartinRolph/SocialSDK Отлично работает, так как теперь я могу использовать ‹xe :restJsonData› управляйте напрямую! Еще раз спасибо за помощь - person Martin Holland; 23.07.2014