Полиморфизм в веб-сервисах JAX-RPC - PullRequest
4 голосов
/ 29 октября 2008

У меня есть веб-сервис JAX-RPC (Java), который должен возвращать сложное полиморфное значение. Чтобы быть более конкретным, структура класса выглядит примерно так:

abstract class Child {
}

class Question extends Child {
    private String name;
    // other fields, getters, and setters
}

class Section extends Child {
    private String label;
    private Child[] children;
    // getters and setters
}

class Quiz {
    private Child[] elements;
    // getter and setter
}

В моем веб-сервисе есть метод, который возвращает Викторину, которая, конечно, может содержать Вопросы и Разделы, которые могут содержать Вопросы и другие Разделы, и так далее, и так далее. Однако, когда я генерирую WSDL, в него входят только Child и Quiz. Когда я вызываю веб-сервис, я возвращаю элемент Quiz с нужным количеством дочерних элементов, но все они являются дочерними элементами, и все они пусты .

Есть ли хороший способ сделать эту работу, кроме простого возврата XML в виде строки?

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

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

Может быть, кто-то все еще ищет это, это можно сделать по оси 1.4:

  1. Добавьте следующую строку в ваш раздел файла развертывания веб-службы оси (wsdd):

    <parameter name="emitAllTypesInWSDL" value="true" />
    
  2. Измените задачу в файле сборки ant, добавив в нее дополнительные классы:

    <axis-java2wsdl ... extraClasses="..."></axis-java2wsdl>
    

    В extraClasses упоминаются все классы, которые будут переданы, поскольку ось не может угадать, какие дочерние элементы вы будете передавать / возвращать как параметры.

Готово, теперь вы можете передавать производные классы в методы, принимающие родительские классы. Etc:

// server side class A { ...}
class B extends A {...}
class C extends A {...}

// ws
class wsAxis { public void processPolymorphCall(A obj); }

// client side
wsAxis.processPolymorphCall(new C());

// this will work now, as much as returning derivated classes in place of base class.
1 голос
/ 30 октября 2008

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

class Child 
{
    private Section section;
    private Question question;

   // Constructor, etc...
}

class Question 
{
    private String name;
    // other fields, getters, and setters
}

class Section 
{
    private String label;
    private Child[] children;
    // getters and setters
}

class Quiz 
{
    private Child[] elements;
    // getter and setter
}

Что требует, чтобы клиент проверял, какой член ребенка заселен, и я ужасно уродлив, я знаю.

...