Domanda

sto usando Axis per modellare un webservice campione. Quello che sto facendo ora sta cercando di capire quali sono i limiti del WSDL e il codice di generazione automatica.

Ora per un po 'di codice lato server:

questo è lo scheletro del servizio Web di esempio:

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

e le mie classi di dati:     classe astratta pubblica 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 */
}

Lo strumento di Eclipse per Axis2 è molto felice di generare un WSDL da queste fonti, tra cui lo schema per le classi di attributi, che è:

<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>

Ora, se vedi qualcosa di strano qui, AbstractAttribute non ha la ** abstract = "true" attributo **, e definire un elemento valore anyType, che ottiene riscrivere in IntAttribute e StirngAttribute. Io non so nemmeno se questo è uno schema legale (non credo che sia legale, tra l'altro).

Più, se provo a generare un client da questo WSDL (sempre utilizzando gli strumenti Eclipse) le sorgenti generate non compilare, perché AbstractAttribute definisce un

Object localValue;

e Int / String attributo definisce

int localValue;

e

String localValue;

.. Ho cercato di "accogliere" le fonti (senza molte speranze, ovviamente), e i risultati sono che il server tenta di creare un'istanza di un'istanza AbstractAttribute (lanciando un InstantiationException).

Quindi la mia domanda è: esiste un modo per modellare qualcosa di simile al modello di dati di cui sopra, o di servizi e schemi XML web in generale, non sono gli strumenti migliori da utilizzare per questo caso particolare

?
È stato utile?

Soluzione

Per spiegare il problema si è verificato, aiuta a pensare a cosa Axis deve fare quando il servizio si chiama.

Axis è semplicemente una java web-application ... quando riceve una richiesta di un servizio, si cercherà la mappatura che avete definito per esso. Se trova una mappatura, tenta di creare un'istanza delle classi necessarie che avete definito per soddisfare la richiesta.

Se avete definito le classi come astratto o come interfacce, allora si otterrà InstantiationExceptions poiché questi tipi non possono essere creati. Quando l'asse ha tentato di creare il WSDL, non sarà in grado di capire che tipo di mettere in modo che userà "anyType".

Per rispondere alla tua domanda: è possibile utilizzare il modello si dispone sopra nel codice, ma non sarà in grado di utilizzare queste classi con Axis. Quello che abbiamo fatto di solito nei nostri progetti è:

  1. Definire le classi di cui abbiamo bisogno, come faremmo in una tipica applicazione orientata agli oggetti
  2. Definisci "trasporti-solo" le classi che vengono utilizzate per i servizi web. Queste classi sono composte da tipi semplici e possono essere facilmente creati. Essi sono utilizzati solo per lo scambio di messaggi web-service. Usiamo queste classi con Axis.
  3. Trova un modo per questi due tipi di classi di condividere facilmente / scambiare informazioni. Si possono avere le interfacce che sono condivisi da entrambi (ma Asse non conosce) o anche usare BeanUtils.copyProperites per mantenere due oggetti diversi in sincronia.

La speranza che risponde alla tua domanda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top