Frage

Ich verwende Achse eine Probe WebService zu modellieren. Was ich jetzt versucht, zu verstehen, zu tun, die die Grenzen der automatisierten Wsdl und Codegenerierung sind.

Jetzt für einige Server-Seite Code:

Dies ist das Skelett des Probe Web-Service:

public class TestWebService {
  public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
    ....

und meine Datenklassen:     public abstract class AbstractAttribute {       String name;

  /*get/set for name*/
  public abstract T getValue();
  public abstract void setValue(T value);
}

public class IntAttribute extends AbstractAttribute<Integer> {
  Integer value;
  public Integer getValue(){ return value; }
  public void setValue(Integer value){ this.value = value; }
}

public class StringAttribute extends AbstractAttribute<String> {
  String value;
  /* ok, you got the point, get/set for value field */
}

Das Eclipse-Tool für Axis2 ist sehr glücklich, eine WSDL-Datei aus diesen Quellen zu erzeugen, einschließlich dem Schema für die Attributklassen, die lauten:

<xs:complexType name="AbstractAttribute">
    <xs:sequence>
        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
        <xs:element minOccurs="0" name="value" nillable="true" type="xs:anyType"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="IntAttribute">
    <xs:complexContent>
        <xs:extension base="xsd:AbstractAttribute">
            <xs:sequence>
                <xs:element minOccurs="0" name="value" nillable="true" type="xs:int"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="StringAttribute">
    <xs:complexContent>
        <xs:extension base="xsd:AbstractAttribute">
            <xs:sequence>
                <xs:element minOccurs="0" name="value" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

jetzt sehen, ob etwas seltsam hier, hat AbstractAttribute nicht die ** abstract = "true" ** Attribut, und definiert ein anyType Wert Element, das in IntAttribute und StirngAttribute umschreiben zu bekommen. Ich weiß nicht einmal, ob dies ein rechtliches Schema ist (ich glaube nicht, es ist legal, übrigens).

Mehr, wenn ich versuche, einen Client von diesem Wsdl zu erzeugen (immer die Eclipse-Tool) die erzeugten Quellen nicht kompilieren, weil AbstractAttribute definiert ein

Object localValue;

Feld und Int / String definiert Attribut

int localValue;

und

String localValue;

.. Ich habe versucht, die Quellen zu „empfangen“ (ohne viele Hoffnungen, natürlich), und die Ergebnisse sind, dass der Server versuchen, eine AbstractAttribute Instanz (wirft einen InstantiationException) zu instanziiert.

Also meine Frage ist: gibt es eine Möglichkeit, über so etwas wie das Datenmodell zu modellieren, oder Web-Service und XML-Schemas' im Allgemeinen sind nicht die besten Werkzeuge für diesen speziellen Fall zu verwenden,

?
War es hilfreich?

Lösung

, um das Problem, das Sie stoßen zu erklären, hilft es, zu denken, was Achse tun muss, wenn der Dienst aufgerufen wird.

Achse ist einfach eine Java-Web-Anwendung ..., wenn es eine Anforderung für einen Dienst empfängt, wird es die Abbildung sehen, die Sie definiert haben. Wenn es eine Abbildung findet, versucht es eine Instanz der notwendigen Klassen erstellen Sie definiert haben, die Anforderung zu.

Wenn Sie die Klassen als abstrakt oder als Schnittstellen definiert haben, dann werden Sie InstantiationExceptions bekommen, da diese Typen nicht erstellt werden kann. Wenn Achse versuchte, die WSDL-Datei zu erstellen, ist es in der Lage, um herauszufinden, welche Art nicht zu setzen, damit es verwenden „anyType.“

Um Ihre Frage zu beantworten: Sie das Modell, das Sie oben in Ihrem Code haben verwenden können, aber Sie verwenden können, um diese Klassen mit Achse nicht. Was wir haben in der Regel in unseren Projekten geschehen ist:

  1. Definieren Sie die Klassen, die wir brauchen, wie wir es in einem typischen objektorientierten Anwendung
  2. Define "Transport-only" Klassen, die für Web-Services verwendet werden. Diese Klassen bestehen aus einfachen Typen und können einfach erstellt werden. Sie sind nur für den Austausch von Web-Service-Nachrichten verwendet. Wir verwenden diese Klassen mit Axis.
  3. Einen Weg finden, für diese beiden Arten von Klassen leicht zu teilen / Informationen auszutauschen. Sie können Schnittstellen haben, die von beiden geteilt werden (aber Achse nicht kennt) oder sogar BeanUtils.copyProperites verwenden zwei verschiedene Objekte synchron zu halten.

Hoffnung, dass Ihre Frage beantwortet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top