我已经将RestDatasource子类化以创建我自己的数据源。这是我的Datasource的构造函数
public CustomDS (){
setDataProtocol(DSProtocol.POSTMESSAGE);
setDataFormat(DSDataFormat.XML);
DataSourceTextField firstNameField = new DataSourceTextField("firstName", "First Name");
DataSourceTextField lastNameField = new DataSourceTextField("lastName", "Last Name");
DataSourceTextField userIDField = new DataSourceTextField("id", "User ID");
setFields(firstNameField, lastNameField, userIDField);
setXmlRecordXPath("/qm:GetResultsResponse/*");
XmlNamespaces ns = new XmlNamespaces();
ns.addNamespace("qm", "someurl");
setXmlNamespaces(ns);
}
这是xml响应
<?xml version="1.0" encoding="UTF-8"?>
<qm:GetResultsResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:qm="someurl" xmlns:warehouse="someurl">
<records xsi:type="warehouse:User" id="id1" firstName="fname1" lastName="Reddy">
<voiceUserProperties languageId="en-US"/>
</records>
<records xsi:type="warehouse:User" id="id2" firstName="fname3" lastName="Reddy">
<voiceUserProperties languageId="en-US"/>
</records>
<records xsi:type="warehouse:User" id="id3" firstName="fnam4" lastName="Reddy">
<voiceUserProperties languageId="en-US"/>
</records>
</qm:GetResultsResponse>
问题
在transformResponse()方法中,response.getDataAsRecordList()。getLength()返回3,但我似乎无法用必需的属性填充记录(即firstName,id,lastName)。有谁在这看错了什么?
修改 正如所建议的那样,我将数据源更改为从DataSource扩展而不是RestDataSource。我还有这个问题。 如果我从XML中删除xsi:type =“warehouse:User”,这可以正常工作。关于这个的任何想法?
答案 0 :(得分:1)
如果您正在尝试解析自己所显示的自定义格式,请不要将RestDataSource子类化,只将子类化为DataSource。 RestDataSource有很多特定于它所期望的消息格式的设置,它具有比你想要解析的结构更多的结构。
..现在你正在使用DataSource - 如果可以的话,去除xsi:type声明,因为它们是浪费的字节。但是,如果您获取每晚构建(来自smartclient.com/builds),您将看到在处理XML时现在忽略这些声明,除非该类型引用您声明的特定数据源。