Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2014, 16:18
cdtj cdtj вне форума
Прохожий
 
Регистрация: 26.06.2012
Сообщения: 16
Версия Delphi: Embarcadero 8.0
Репутация: 132
По умолчанию ArrayOfString, SOAP, Delphi... (Не актуально)

// Тему можно закрыть, проблема как я понял на стороне 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);
  }
}

Последний раз редактировалось cdtj, 07.03.2014 в 08:06.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter