объект из Java-клиента в веб-сервис WCF, десериализация ошибок - PullRequest
1 голос
/ 13 июля 2009

У меня есть веб-служба .NET WCF, которая отлично работает при вызове из другого приложения .NET. Теперь я пытался создать клиент Java для тестирования службы, но один из методов не сработал.

Я пытаюсь отправить список обновлений. Комплексный тип:

<xs:complexType name="ArrayOfRegisterUpdate">
    <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="OneUpdateRegister"
                    nillable="true" type="tns:OneUpdateRegister" /> 
    </xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfRegisterUpdate" nillable="true" 
    type="tns:ArrayOfRegisterUpdate" /> 
<xs:complexType name="OneUpdateRegister">
    <xs:sequence>
        <xs:element minOccurs="0" name="Field" type="tns:RegisterField" /> 
        <xs:element minOccurs="0" name="Value" nillable="true" type="xs:anyType" /> 
    </xs:sequence>
</xs:complexType>
<xs:element name="OneUpdateRegister" nillable="true" type="tns:OneUpdateRegister" />

Мой прокси-сервер Java позволяет мне вставлять любой объект в «Значение», как и ожидалось (это могут быть строки, целые числа или даты и времени) Но если я введу строку, появится следующее исключение:

The formatter threw an exception while trying to deserialize the message: 
There was an error while trying to deserialize parameter http://tempuri.org/:updates. 
The InnerException message was 'There was an error deserializing the object of type 
System.Collections.Generic.List`1
[[xxx.xxx.OneUpdateRegister, XXx.XXx, Version=1.0.0.0, Culture=neutral, `PublicKeyToken=null]]. 
The value 'John' cannot be parsed as the type 'Guid.'. Please see InnerException for more details.

Веб-метод даже не вызывается. Я не знаю, какое отношение имеет тип Guid ко всему этому, я просто вижу этот тип в xsd простых типов.

Есть идеи? Пожалуйста, дайте мне знать любую другую информацию, которая может быть полезна. Спасибо.

Ответы [ 4 ]

1 голос
/ 13 июля 2009

Откуда появился этот фрагмент XML-схемы?

Можете ли вы опубликовать подпись вызываемой операции, включая [OperationContract]? То же самое с контрактом на обслуживание.

Какая подпись вызываемого вами прокси-сервера Java?

Я обеспокоен тем, что эта схема может проверять некоторые XML, которые вы, возможно, не хотите. Например, вы заметили, что у вас может быть последовательность полей, значений, значений?

Это, однако, не объясняет, откуда идет «Гуид».

0 голосов
/ 16 июля 2009

Извините, я только что понял, что оба xsd из тестового клиента в .net solution! В любом случае, они могут дать подсказку.

Это реальные файлы из веб-службы:

[ServiceContract(Namespace = Constants.PublicNamespace)]
    public interface InterfaceName
    {

         ///<summary>
        ///</summary>
        ///<param name="user"></param>
        ///<param name="password"></param>
        ///<param name="id1"></param>
        ///<param name="id2"></param>
        ///<param name="updates"></param>
        ///<returns></returns>
        [OperationContract]
        UpdateRegisterReturn UpdateRegister(
            string user,
            string password,
            int id1,
            int id2,
            List<OneUpdateRegister> updates);

        ... {other methods working just fine}    
    }
}

А это класс OneUpdateRegister:

     ///<summary>
    ///</summary>
    [DataContract(Namespace = Constants.PublicNamespace)]
    public sealed class OneUpdateRegister
    {
        ///<summary>
        ///</summary>
        [DataMember]
        public RegisterField Field { get; set; }

        ///<summary>
        ///</summary>
        [DataMember]
        public object Value{ get; set; } // this is the problematic data member!
    }
0 голосов
/ 16 июля 2009

Боюсь, я не настоящий эксперт в .NEWW. Я думаю, это то, о чем вы меня просили, на стороне сервера:

[System.ServiceModel.ServiceContractAttribute(Namespace="http://xx.es/ServiceName/", ConfigurationName="ServiceName.InterfaceName")]
public interface InterfaceName{

    ....

    [System.ServiceModel.OperationContractAttribute(Action="http://xx.es/ServiceName/InterfaceName/UpdateRegister", ReplyAction="http://xx.es/ServiceName/InterfaceName/UpdateRegisterRes" +
        "ponse")]
    package.UpdateRegisterReturn UpdateRegister(string user, string password, int id1, int id2, System.Collections.Generic.List<package.OneUpdateRegister> updates);

        ....
  }

XML-схема из моей первой записи поступает с сервера из файла ServiceName.xsd

Это подпись моего автоматически сгенерированного Java-прокси:

public es.xx.UpdateRegisterReturn updateRegister(java.lang.String user, java.lang.String password, java.lang.Integer id1, java.lang.Integer id2, es.xx.OneUpdateRegister[] updates) throws java.rmi.RemoteException{

Могу ли я заставить этот параметр Java быть списком, даже если он был сгенерирован автоматически, как это, и даже если он работает с датами и нулями?

Этот файл (ServiceName1.xsd) - единственное место во всем серверном решении, где я могу найти тип Guid:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="anyType" nillable="true" type="xs:anyType" />
  <xs:element name="anyURI" nillable="true" type="xs:anyURI" />
  <xs:element name="base64Binary" nillable="true" type="xs:base64Binary" />
  <xs:element name="boolean" nillable="true" type="xs:boolean" />
  <xs:element name="byte" nillable="true" type="xs:byte" />
  <xs:element name="dateTime" nillable="true" type="xs:dateTime" />
  <xs:element name="decimal" nillable="true" type="xs:decimal" />
  <xs:element name="double" nillable="true" type="xs:double" />
  <xs:element name="float" nillable="true" type="xs:float" />
  <xs:element name="int" nillable="true" type="xs:int" />
  <xs:element name="long" nillable="true" type="xs:long" />
  <xs:element name="QName" nillable="true" type="xs:QName" />
  <xs:element name="short" nillable="true" type="xs:short" />
  <xs:element name="string" nillable="true" type="xs:string" />
  <xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte" />
  <xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt" />
  <xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong" />
  <xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort" />
  <xs:element name="char" nillable="true" type="tns:char" />
  <xs:simpleType name="char">
    <xs:restriction base="xs:int" />
  </xs:simpleType>
  <xs:element name="duration" nillable="true" type="tns:duration" />
  <xs:simpleType name="duration">
    <xs:restriction base="xs:duration">
      <xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?" />
      <xs:minInclusive value="-P10675199DT2H48M5.4775808S" />
      <xs:maxInclusive value="P10675199DT2H48M5.4775807S" />
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="guid" nillable="true" type="tns:guid" />
  <xs:simpleType name="guid">
    <xs:restriction base="xs:string">
      <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:attribute name="FactoryType" type="xs:QName" />
</xs:schema>

Я думаю, это автоматически сгенерированный универсальный файл.

0 голосов
/ 13 июля 2009

Если я попытаюсь с нулевым или с DateTime (Календарь в Java), то нет проблем.Только строки кажутся проблематичными.С другой стороны, предполагается, что целые числа отправляются в виде строк, поэтому с ними происходит та же проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...