当我的Web服务返回父类时,如何为子类生成代理?

时间:2010-03-29 07:51:56

标签: wcf web-services jax-ws

我有一个像这样的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为你提供帮助;)

2 个答案:

答案 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中存在类似的机制。