Frage

Ich habe einen JAX-RPC (Java) Web-Service, einen komplexen polymorphen Wert zurückgeben muss. Um genauer zu sein, die Klassenstruktur ist so etwas wie folgt aus:

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
}

Meine Web-Service verfügt über eine Methode, die ein Quiz zurückgibt, was natürlich können Fragen und Abschnitte enthalten, die Fragen und anderen Bereichen, und so weiter und so weiter enthalten. Allerdings, wenn ich generieren die WSDL, nur Kind und Quiz es in machen. Wenn ich die Web-Service aufrufen, bekomme ich wieder ein Quiz Element mit der richtigen Anzahl von Kindern, aber sie sind alle Child-Elemente, und sie sind alle leer .

Gibt es eine gute Möglichkeit, diese Arbeit zu machen, kurz nur XML als String zurückkehrt?

Bevor jemand fragt, aufgrund von Umständen außerhalb meiner Kontrolle, ich kann nicht JAX-WS verwenden.

War es hilfreich?

Lösung

Ich glaube nicht, JAX-RPC-Polymorphismus in dieser Art und Weise unterstützt. Ich hatte ein ähnliches Problem, und hatte um ihn zu arbeiten, indem Sie eine Klasse erstellen, die nur zwei Mitglieder hatten - einen für jede der beiden Klassen, die möglicherweise zurückgegeben werden könnten - und nur eine bevöl je nach Typ ich zurückkehren wollte. Also in Ihrem Fall:

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
}

, die der Kunde verlangt zu prüfen, welche Mitglied des Kindes ausgefüllt ist, und ist schrecklich hässlich, ich weiß.

Andere Tipps

Vielleicht hat jemand noch sucht es, kann es in der Achse erfolgen 1.4:

  1. In nächste Zeile in Ihren Abschnitt der Achse Webservice Bereitstellungsdatei (WSDD):

    <parameter name="emitAllTypesInWSDL" value="true" />
    
  2. Ändern Sie bitte Ihre Aufgabe in Ant-Build-Datei 'extraClasses' enthalten:

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

    In extraClasses erwähnt alle Klassen, die weitergegeben werden, da Achse nicht in der Lage zu erraten, welche Childs Sie vorbei sein werden / als Parameter zurück.

Fertig, jetzt können Sie derivated Klassen in Methoden übergeben akzeptiert geordneten Klassen. 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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top