// Тему можно закрыть, проблема как я понял на стороне Web Service Toolkit
Доброго дня всем!
Есть некий web service (WSDL), вроде бы с ним всё хорошо и работает как надо, до тех пор пока не требуется передача параметров в виде массива строк, есть тонкий клиент на php, там с этим проблем нет, а на delphi все вываливается ошибкой.
Вот так всё это хозяйство объявляется на php:
PHP код:
$params = array( 'sid' => $strSessionID,
'creatorHandle' => $strHandleID,
'attrVals' => array(
'requestor',
'$strHandleID',
'summary',
'summary_here',
'description',
'Description_here',
'priority',
'3',
'category',
'chgcat:400022'
),
итд.
Так это выглядит в 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);
}
}