|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
ArrayOfString, SOAP, Delphi... (Не актуально)
// Тему можно закрыть, проблема как я понял на стороне Web Service Toolkit
Доброго дня всем! Есть некий web service (WSDL), вроде бы с ним всё хорошо и работает как надо, до тех пор пока не требуется передача параметров в виде массива строк, есть тонкий клиент на php, там с этим проблем нет, а на delphi все вываливается ошибкой. Вот так всё это хозяйство объявляется на php: PHP код:
Так это выглядит в delphi: (Класс в котором используется этот массив) Код:
createRequest_Type = class(TBaseComplexRemotable) private Fsid : integer; FcreatorHandle : string; FattrVals : ArrayOfString; FpropertyValues : ArrayOfString; Ftemplate : string; Fattributes : ArrayOfString; FnewRequestHandle : string; FnewRequestNumber : string; public constructor Create();override; procedure FreeObjectProperties();override; published property sid : integer read Fsid write Fsid; property creatorHandle : string read FcreatorHandle write FcreatorHandle; property attrVals : ArrayOfString read FattrVals write FattrVals; property propertyValues : ArrayOfString read FpropertyValues write FpropertyValues; property template : string read Ftemplate write Ftemplate; property attributes : ArrayOfString read Fattributes write Fattributes; property newRequestHandle : string read FnewRequestHandle write FnewRequestHandle; property newRequestNumber : string read FnewRequestNumber write FnewRequestNumber; end; (Класс массива) Код:
ArrayOfString = class(TBaseSimpleTypeArrayRemotable) private FData : array of string; private function GetItem(AIndex: Integer): string; procedure SetItem(AIndex: Integer; const AValue: string); protected function GetLength():Integer;override; procedure SaveItem(AStore : IFormatterBase;const AName : String;const AIndex : Integer);override; procedure LoadItem(AStore : IFormatterBase;const AIndex : Integer);override; public class function GetItemTypeInfo():PTypeInfo;override; procedure SetLength(const ANewSize : Integer);override; procedure Assign(Source: TPersistent); override; property Item[AIndex:Integer] : string read GetItem write SetItem; default; end; (Мои попытки объявления (Пробовал задавать напрямую, суть не меняется.)) Код:
attrVals := ArrayOfString.create(); attrVals.SetLength(8); attrVals[0] := 'customer'; attrVals[1] := 'cnt:D690862CF94AFC4B9819AE61359E0B9E'; attrVals[2] := 'category'; attrVals[3] := 'pcat:400437'; attrVals[4] := 'assignee'; attrVals[5] := 'cnt:D690862CF94AFC4B9819AE61359E0B9E'; attrVals[6] := 'group'; attrVals[7] := 'cnt:BDAC9FFB5074014FAAAB0A1162BFF55C'; crType.attrVals.Assign(attrVals); Код ошибки: ESOAPException: code = 'soapenv:Server.userException'; message = 'org.xml.sax.saxexception: Invalid element is usdjws65.ArrayOfString - _string'. Декомпилировал ява файл на всякий: Код:
package usdjws65; import java.io.Serializable; import java.lang.reflect.Array; import java.util.Arrays; import javax.xml.namespace.QName; import org.apache.axis.description.ElementDesc; import org.apache.axis.description.TypeDesc; import org.apache.axis.encoding.Deserializer; import org.apache.axis.encoding.Serializer; import org.apache.axis.encoding.ser.BeanDeserializer; import org.apache.axis.encoding.ser.BeanSerializer; public class ArrayOfString implements Serializable { static final long serialVersionUID = -1L; private String[] string; private Object __equalsCalc = null; private boolean __hashCodeCalc = false; private static TypeDesc typeDesc = new TypeDesc(ArrayOfString.class); public String[] getString() { return this.string; } public void setString(String[] paramArrayOfString) { this.string = paramArrayOfString; } public String getString(int paramInt) { return this.string[paramInt]; } public void setString(int paramInt, String paramString) { this.string[paramInt] = paramString; } public synchronized boolean equals(Object paramObject) { if (!(paramObject instanceof ArrayOfString)) { return false; } ArrayOfString localArrayOfString = (ArrayOfString)paramObject; if (paramObject == null) { return false; } if (this == paramObject) { return true; } if (this.__equalsCalc != null) { return this.__equalsCalc == paramObject; } this.__equalsCalc = paramObject; boolean bool = ((this.string == null) && (localArrayOfString.getString() == null)) || ((this.string != null) && (Arrays.equals(this.string, localArrayOfString.getString()))); this.__equalsCalc = null; return bool; } public synchronized int hashCode() { if (this.__hashCodeCalc) { return 0; } this.__hashCodeCalc = true; int i = 1; if (getString() != null) { for (int j = 0; j < Array.getLength(getString()); j++) { Object localObject = Array.get(getString(), j); if ((localObject != null) && (!localObject.getClass().isArray())) { i += localObject.hashCode(); } } } this.__hashCodeCalc = false; return i; } public static TypeDesc getTypeDesc() { return typeDesc; } public static Serializer getSerializer(String paramString, Class paramClass, QName paramQName) { return new BeanSerializer(paramClass, paramQName, typeDesc); } public static Deserializer getDeserializer(String paramString, Class paramClass, QName paramQName) { return new BeanDeserializer(paramClass, paramQName, typeDesc); } static { typeDesc.setXmlType(new QName("http://www.ca.com/UnicenterServicePlus/ServiceDesk", "ArrayOfString")); ElementDesc localElementDesc = new ElementDesc(); localElementDesc.setFieldName("string"); localElementDesc.setXmlName(new QName("", "string")); localElementDesc.setXmlType(new QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(localElementDesc); } } Последний раз редактировалось cdtj, 07.03.2014 в 08:06. |