Xpages SBT <xe:restjsondata>&amp; java.util.ArrayList与com.ibm.commons.util.io.json.JsonJavaObject不兼容</xe:restjsondata>

时间:2014-07-21 08:13:32

标签: json xpages ibm-sbt

我尝试在XPage中使用具有不同休息服务的SBT中的端点功能(对于示例中的那些)。 经过一些调整后验证工作正在进行(感谢Serdar!)但是我想模仿StackOverflow示例并通过<xe:restJsonData>使用响应并重复控制。

如果我更改params以匹配我的服务,那么使用SO示例作为我的起点我得到此错误...

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

我猜测它与分裂路径有关,因为生成的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" ] } ] 我尝试过空白或&#34; /&#34;但得到同样的错误。 我知道数据会回来计算出的值 @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'

1 个答案:

答案 0 :(得分:0)

我之前碰到过同样的问题。这是GenericRestJsonDataSource的无能力。如果远程服务提供的是数组而不是对象,则来自客户端服务的数据将返回ArrayList JsonJavaObject个。

但是,它希望JsonJavaObject包含ArrayListJsonJavaObject

这就是为什么在前面的BaseCamp示例中(在链接的问题上)我设计了一个额外的Java bean来提取数据并维护自己的List结构。这对缓存也有很大的帮助。

您的数据应采用以下格式:

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

就像在SO示例中一样。在这种情况下,splitPath应为items

事实上,这是课堂上的一个简单修复。应修改GenericRestJsonDataSource中的访问者类以检查返回的项是否为ArrayList。但是当时,设计我自己的Service bean似乎是一种更方便的方法。