当我为我的WebService参数使用动态类时,不包括公共属性

时间:2009-02-19 21:20:54

标签: flex actionscript-3 web-services class actionscript

我有一个动态类,它是一个Value Object,用于将参数传递给WebService。它有两个公共属性:

package
{
    [Bindable]
    public dynamic class WebServiceCriteria
    {
        public var property1:String;

        public var property2:String;
    }
}

我在应用程序的一部分中设置了这两个属性:

var myCriteria:WebServiceCriteria = new WebServiceCriteria();

myCriteria.property1 = "x";

myCriteria.property2 = "y";

然后我在我的应用程序的另一点添加了其他 - 动态 - 属性:

myCriteria.property3 = "z";

但是,当我将实例作为参数传递给WebService时,即使它们具有值,也不会发送原始的两个公共属性(正如我在Fiddler中看到的那样)。但是,我可以在send()之前的调试器中将它们视为我的Class实例的属性。

operation.arguments = {args: myCriteria};

operation.send(); // only property3 is sent

为什么没有发送这两个属性?

以下是发送到WebService的SOAP请求的示例:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <intf:webservice_controller xmlns:intf="http://childDir.parentDir">
      <args xsi:type="apachesoap:Map" xmlns:apachesoap="http://xml.apache.org/xml-soap">
        <item>
          <key xsi:type="xsd:string">property1</key>
          <value xsi:type="xsd:string"></value>
        </item>
        <item>
          <key xsi:type="xsd:string">property2</key>
          <value xsi:type="xsd:string"></value>
        </item>
        <item>
          <key xsi:type="xsd:string">property3</key>
          <value xsi:type="xsd:string">z</value>
        </item>
      </args>
    </intf:webservice_controller>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

3 个答案:

答案 0 :(得分:1)

尝试将其添加到构造函数中:

package
{
    [Bindable]
    public dynamic class WebServiceCriteria
    {
        public var property1:String;
        public var property2:String;

        function WebServiceCriteria()
        {
             prototype.property1 = null;
             prototype.property2 = null;
        }
    }
}

......因为似乎只有Object属性是可枚举的

答案 1 :(得分:1)

Flex 3.0手册中记录了此行为。有关详细信息,请参阅Dynamic Classes。直接引用:

  

[...]但是,以这种方式创建的方法无法访问[example]类的任何私有属性或方法。此外,甚至对[example]类的公共属性或方法的引用也必须使用this关键字或类名进行限定。

答案 2 :(得分:-1)

我不相信您可以将对象发送到Web服务。如果要发送对象,则需要使用远程对象。要使用Web服务,您需要将对象转换为某种xml或soap请求。像

var myCriteria:WebServiceCriteria = new WebServiceCriteria();

myCriteria.property1 = "x";

myCriteria.property2 = "y";

operation.send(<request> <property1>{myCriteria.property1}</property1> <property2>{myCriteria.property2}</property2> </request>);

http://livedocs.adobe.com/flex/3/html/help.html?content=data_intro_2.html