我有一个像这样的JAX-WS WebService:
public class ParentClass{
public String str1;
}
public class ChildClass : ParentClass{
public String str2;
}
public class WebService{
public ParentClass WebMethod(){
return GetFirstChildClass(); //Return a child class
}
}
当我通过Visual Studio为此Web服务生成代理时,VS只为ParentClass生成代理,但我也需要ChildClass。对于解决方法,我向WebService添加一个伪方法,该方法返回ChildClass以在客户端为ChildClass生成代理。
public class WebService{
...
//This is a dummy method to generate proxy for ChildClass in client.
public ChildClass DummyWebMethod(){
return null;
}
}
此外,我在java(JAX-WS)中编写Web服务,我的客户端是SilverLight应用程序。 这个问题有更好的解决方案吗?
tanx为你提供帮助;)
答案 0 :(得分:1)
在网上深度搜索后发现@XmlSeeAlso注释来解决这个问题。 我们应该在我们的服务上面添加这个注释来生成所需的引用,例如: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlSeeAlso.html
@XmlSeeAlso({ParentClass.class})
public class WebService{
...
答案 1 :(得分:0)
如果您直接将WebService.WebMethod
作为进程内DLL调用,则会返回ParentClass
类型的值,您必须手动向下转换为ChildClass
。这就是继承和多态如何工作的原因。为什么Web服务代理类的行为会有所不同?
编辑基于评论...
在.NET WCF服务中,您可以通过告诉序列化程序有关子类的问题来解决问题,例如
[DataContract]
[KnownType(typeof(ChildClass))]
public class ParentClass {
public String str1;
}
[DataContract]
public class ChildClass : ParentClass {
public String str2;
}
然后,子类包含在生成的客户端代理类中,您可以转换为它。我想在JAX-WS中存在类似的机制。