13 Stimmen

Veröffentlichung mehrerer Ports mit einem Dienst unter Verwendung von JAX-WS 2.0 und @WebService

Ich möchte einen SOAP-Dienst mit mehreren exponierten Porttypen erstellen, wobei jeder Porttyp eine eigene Schnittstelle hat. Ich versuche, dies mit JAX-WS 2.0 zu tun.

Beispiel:

interface A:
    ObjectA get(String name);

interface B:
    ObjectB get(String name);

Service:
    port A
          get
    port B
          get

Das Problem, das ich habe, ist, dass ein @WebService mit einer einzigen Klasse/Schnittstelle definiert ist, so dass die einzige Möglichkeit, die ich in der Lage bin, dies einzurichten, zwei separate Dienste ist. Jeder Dienst wird durch eine separate Klasse mit einer @WebService-Annotation implementiert.

Ich möchte beide Ports über denselben Dienst bereitstellen, um deutlich zu machen, dass beide Teil derselben API sind. Ist dies möglich?

Was ich wirklich will, ist eine Art von verschachtelter Namespace-Unterstützung in der WSDL, damit ich dieselben Methoden in verschiedenen Namespaces haben kann. Ich werde get/set/delete-Methoden für verschiedene Arten von Daten nebeneinander haben, aber ich möchte sie nicht alle in der gleichen großen Schnittstelle mit getA/getB und so weiter, da ich in der Lage sein möchte, neue Datentypen später hinzuzufügen, ohne alle Clients zu zwingen, aus dem neuen Satz von WSDLs zu regenerieren. Alle Tipps zum Erreichen dieses Ziels sind willkommen, auch wenn es bedeutet, eine andere Art der Generierung der WSDL aus Java-Code zu verwenden.

1voto

Victor Stafusa Punkte 13306

Sie können versuchen, eine der Methoden umzubenennen und die Felder action oder operationName in der @WebMethod-Annotation explizit zu setzen.

1voto

rbhojan Punkte 83

Ich würde vorschlagen, statt den Eingabeparameter als String zu definieren, sollten Sie in Erwägung ziehen, für jede dieser Methoden einen RequestType (einen Complextype in xsd) zu definieren, was Ihnen die folgenden Vorteile bieten würde:
1. Wenn Sie einen komplexen Typ definiert haben, kann sich die Anfrage unabhängig entwickeln, indem Sie dem komplexen Typ weitere Elemente hinzufügen, während sich die Signatur der Webmethode in der WSDL nicht ändert.
2. Sie können den gleichen Namen für die 2 Methoden wie u haben oben (sagen Sie get(...)), während beide von ihnen die verschiedenen Anfrage-Typen haben. Sie können dies entweder durch die Definition der beiden verschiedenen Elemente in der xsd (mit dem gleichen Namensraum) mit unterschiedlichen Anfrage Namen zu erreichen. Wenn Sie den gleichen Namen für die Anforderungselemente haben wollen, dann müssen Sie in Betracht ziehen, sie in verschiedenen Namensräumen zu definieren. Auf diese Weise werden sie in der OOP in verschiedenen Paketen generiert und können daher denselben Namen haben.

Außerdem würde ich vorschlagen, dass es immer gut ist, die Namen der Operationen und der Nachrichten so eindeutig und spezifisch wie möglich zu gestalten.

0voto

Das Überladen von Funktionen wird in Webservices nicht akzeptiert. Ich meine, dass mehrere Operationen mit demselben Namen nicht möglich sind. Sie benötigen den gleichen Port und den gleichen Namen der Operation, um verschiedene Objektklassen zurückzugeben, können Sie Folgendes versuchen.

Schnittstelle

public interface OB {
public Object get(String name);
}

Webservice

@Override
@WebMethod
public Object get(String name) {
    if(name.equals("A")){
        return new ObjectA("A");
    }else if(name.equals("B")){
        return new ObjectB(1);
    }else {
        return null;
    }
}

In diesem Fall müssen Sie feststellen, welche Klasse Objekt müssen von der Anfrage zurückgegeben werden und dann konstruieren sie und zurückgeben ist eine der Möglichkeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X