Question

J'utilise Axis pour modéliser un échantillon WebService. Ce que je fais est maintenant essayer de comprendre quelles sont les limites de la wsdl automatisée et la génération de code.

Maintenant, pour un code côté serveur:

Ceci est le squelette de l'échantillon service Web:

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

et mes classes de données:     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 */
}

L'outil Eclipse pour Axis2 est tout à fait heureux de générer un fichier WSDL à partir de ces sources, y compris le schéma pour les classes d'attributs, qui est:

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

maintenant, si voir quelque chose d'étrange ici, AbstractAttribute n'a pas le ** abstract = « true » ** attribut et définir un élément de valeur anyType, qui se réécrire dans IntAttribute et StirngAttribute. Je ne sais même pas si cela est un schéma juridique (je ne pense pas que ce soit légal, par la voie).

En savoir plus, si je tente de générer un client de cette wsdl (toujours en utilisant les outils Eclipse) les sources générées ne seront pas compiler, car AbstractAttribute définit un

Object localValue;

et Int / String attribut définit

int localValue;

et

String localValue;

.. J'ai essayé de « accueillir » les sources (sans beaucoup d'espoirs, évidemment), et les résultats sont que le serveur essaie d'instancier une instance AbstractAttribute (jetant un InstantiationException).

Alors ma question est: il y a une façon de modéliser quelque chose comme le modèle de données ci-dessus, ou des services Web et des schémas XML en général ne sont pas les meilleurs outils à utiliser pour ce cas particulier

?
Était-ce utile?

La solution

Pour expliquer le problème que vous rencontrez, il aide à penser à ce que l'Axe doit faire lorsque votre service est appelé.

Axis est simplement une application web java ... quand il reçoit une demande d'un service, il regardera le mappage que vous avez défini pour cela. Si elle trouve une correspondance, il tente de créer une instance des classes nécessaires que vous avez défini pour traiter la demande.

Si vous avez défini les classes comme abstraite ou interfaces alors vous aurez InstantiationExceptions puisque ces types ne peuvent pas être créés. Lorsque l'Axe a essayé de créer le fichier WSDL, il ne sera pas en mesure de déterminer quel type de mettre il utilisera « anyType. »

Pour répondre à votre question: vous pouvez utiliser le modèle ci-dessus vous avez dans votre code, mais vous ne serez pas en mesure d'utiliser ces classes avec Axis. Ce que nous avons fait habituellement dans nos projets est:

  1. Définir les classes dont nous avons besoin, comme nous le ferions dans une application orientée objet typique
  2. Définir les classes "transport uniquement" qui sont utilisés pour les services Web. Ces classes sont composées de types simples et peuvent être facilement créés. Ils ne sont utilisés que pour échanger des messages de service Web. Nous utilisons ces classes avec Axis.
  3. trouver un moyen pour ces deux types de classes de partager facilement / échanger des informations. Vous pouvez avoir des interfaces qui sont partagées par les deux (mais Axis ne sait pas) ou même utiliser BeanUtils.copyProperites pour garder deux objets différents synchronisés.

L'espoir qui répond à votre question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top