Mikayil Abdullayev
Mikayil Abdullayev

Reputation: 12376

Error when deserializing Java client request to WCF service

I have a WCF service with yet only one method:

[OperationContract]
void SaveDocument (InwardDocument doc);

[DataContract]
public class InwardDocument{
   [DataMember]
   public Citizen Citizen {get;set;}
   ....
}

[DataContract]
public class Citizen{
   [DataMember]
   public string LastName {get;set;}
   ....
}

I've tested the service with both WCF test client and a separate .NET console application. In both cases the service works as expected. But when a java client tries to consume it, a deserialization problem occurs. I've put some markers inside the SaveDocument method to see what causes the problem:

public void SaveDocument(InwardDocument doc){
   if(doc==null)
      throw new ArgumentnullException("InwardDocument");
   if(doc.Citizen==null)
      throw new ArgumentnullException("InwardDocument.Citizen");//This exception is thrown when consumed by java client
}

As you can see the first exception is skipped which means doc argument itself is not null but for some reason, the Citizen property is null. The guy who generates the request in java client confirms that the InwardDocument.Citizen property is not null by debugging the code. In fact we've had a problem generating the proxy class in that java client which I describe in this SO thread. So I'm assuming it has something to do with that same problem.Maybe I need to add some more attributes to my classes and their members to care of any such problems that might occur in other platforms? Any suggestions are appreciated.

Upvotes: 0

Views: 100

Answers (2)

Mikayil Abdullayev
Mikayil Abdullayev

Reputation: 12376

The problem was caused by incorrect creation of the corresponding JAXBelement instances. The solution to the problem is in this SO thread answer

Upvotes: 0

jtabuloc
jtabuloc

Reputation: 2535

Have you tried to add Know Type attribute in your InwardDocument class. See link here.

[DataContract]
[KnownType(typeof(Citizen))]
public class InwardDocument{
   [DataMember]
   public Citizen Citizen {get;set;}
   ....
}

Upvotes: 1

Related Questions