我尝试在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'
答案 0 :(得分:0)
我之前碰到过同样的问题。这是GenericRestJsonDataSource
的无能力。如果远程服务提供的是数组而不是对象,则来自客户端服务的数据将返回ArrayList
JsonJavaObject
个。
但是,它希望JsonJavaObject
包含ArrayList
个JsonJavaObject
。
这就是为什么在前面的BaseCamp示例中(在链接的问题上)我设计了一个额外的Java bean来提取数据并维护自己的List结构。这对缓存也有很大的帮助。
您的数据应采用以下格式:
{
items: [
{
prop: value, ....
},
{
prop: value, ....
}
]
}
就像在SO示例中一样。在这种情况下,splitPath
应为items
。
事实上,这是课堂上的一个简单修复。应修改GenericRestJsonDataSource
中的访问者类以检查返回的项是否为ArrayList
。但是当时,设计我自己的Service bean似乎是一种更方便的方法。