Когда я использую динамический класс для своих аргументов WebService, публичные свойства не включаются - PullRequest
1 голос
/ 20 февраля 2009

У меня есть динамический класс, который является объектом значения, который используется для передачи аргументов в 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), даже если они имеют значения. Но я могу видеть их как свойства моего экземпляра Class в отладчике непосредственно перед send ().

operation.arguments = {args: myCriteria};

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

Почему эти два свойства не отправлены?

Вот пример SOAP-запроса, отправляемого в WebService:

<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 ]

1 голос
/ 22 февраля 2009

Это поведение описано в руководствах Flex 3.0. См. Динамические классы для получения дополнительной информации. Прямая цитата:

[...] Методы, созданные таким образом, однако, не имеют доступа к каким-либо закрытым свойствам или методам класса [example]. Более того, даже ссылки на открытые свойства или методы класса [example] должны указываться либо с ключевым словом this, либо с именем класса.

1 голос
/ 20 февраля 2009

Попробуйте добавить это в свой конструктор:

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

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

... Как кажется, только свойства Object являются перечисляемыми

0 голосов
/ 23 февраля 2009

Я не верю, что вы сможете отправить объект в веб-сервис. Если вы хотите отправить объект, вам нужно будет использовать удаленный объект. Чтобы использовать веб-сервис, вам нужно превратить ваш объект в какой-то запрос XML или мыла. как

var myCriteria:WebServiceCriteria = new WebServiceCriteria();</p> <p>myCriteria.property1 = "x";</p> <p>myCriteria.property2 = "y";</p> <p>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

...