Как создать прокси для дочернего класса, когда мой веб-сервис возвращает родительский класс? - PullRequest
2 голосов
/ 29 марта 2010

У меня есть такой 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, 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), а мой клиент - приложение SilverLight. Есть ли лучшее решение для этой проблемы?

Tanx за вашу помощь;)

Ответы [ 2 ]

1 голос
/ 01 марта 2011

После глубокого поиска в сети нашел аннотацию @XmlSeeAlso для решения этой проблемы. Мы должны добавить эту аннотацию над нашими службами для создания необходимых ссылок, таких как: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlSeeAlso.html

@XmlSeeAlso({ParentClass.class})
public class WebService{
...
0 голосов
/ 29 марта 2010

Если вы вызвали WebService.WebMethod напрямую как внутрипроцессную DLL, она вернет значение типа ParentClass, которое вам придется вручную уменьшить до ChildClass. Вот как наследование и полиморфизм должны работать. Почему прокси-класс веб-службы должен вести себя иначе?

РЕДАКТИРОВАТЬ: на основе комментариев ...

В службе .NET WCF вы могли бы решить проблему, сообщив сериализатору о дочернем классе, например,

[DataContract]
[KnownType(typeof(ChildClass))]
public class ParentClass {
    public String str1;
}

[DataContract]
public class ChildClass : ParentClass {
    public String str2;
}

Дочерний класс затем включается в сгенерированные клиентские прокси-классы, и вы можете преобразовать его в него. Я полагаю, что подобный механизм существует в JAX-WS.

...