Pregunta

Estoy usando Eje para modelar un servicio web de muestra. Lo que estoy haciendo ahora es tratar de comprender cuáles son las limitaciones de la generación automática de código WSDL y.

Ahora un poco de código del lado del servidor:

Este es el esqueleto del servicio Web de ejemplo:

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

y mis clases de datos:     clase abstracta pública 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 */
}

La herramienta Eclipse para Axis2 es muy feliz para generar un WSDL de estas fuentes, incluyendo el esquema para las clases de atributos, que es:

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

Ahora, si ver algo extraño aquí, AbstractAttribute no tiene la más abstracta ** = "true" ** atributo y definir un elemento de valor anyType, que llegar a grabar en IntAttribute y StirngAttribute. Ni siquiera sé si esto es un esquema legal (no creo que sea legal, por cierto).

Más, si trato de generar un cliente de este WSDL (siempre utilizando las herramientas de Eclipse) las fuentes generadas no compilará, porque AbstractAttribute define un

Object localValue;

campo y Int / Cadena atributo define

int localValue;

y

String localValue;

.. Traté de "acomodar" las fuentes (sin muchas esperanzas, obviamente), y los resultados son que el servidor intenta crear una instancia AbstractAttribute (lanzando una InstantiationException).

Así que mi pregunta es: ¿hay una manera de modelar algo así como el modelo de datos anterior o servicios y esquemas XML Web en general no son las mejores herramientas a utilizar para este caso particular

?
¿Fue útil?

Solución

Para explicar el problema que está encontrando, ayuda a pensar en lo que tiene que hacer eje cuando el servicio se llama.

Axis es simplemente una aplicación Java Web ... cuando recibe una solicitud de un servicio, se buscará el mapeo que ha definido para ello. Si se encuentra una correspondencia, se trata de crear una instancia de las clases necesarias que ha definido para atender la solicitud.

Si ha definido las clases como abstracto o como interfaces entonces obtendrá InstantiationExceptions ya que estos tipos no se pueden crear. Cuando Eje intentó crear el WSDL, que no será capaz de averiguar qué tipo de poner por lo que utilizará "anyType."

Para responder a su pregunta: ¿Se puede utilizar el modelo que tienes anterior en el código, pero no será capaz de utilizar estas clases con el eje. Lo que hemos hecho típicamente en nuestros proyectos es:

  1. Definir las clases que necesitamos, como lo haría en una aplicación típica orientada a objetos
  2. Definir "sólo transporte" clases que se utilizan para los servicios web. Estas clases están compuestas de los tipos simples y se pueden crear fácilmente. Sólo se utilizan para el intercambio de mensajes de servicios web. Utilizamos estas clases con el eje.
  3. encontrar alguna manera para estos dos tipos de clases para compartir fácilmente / intercambio de información. Puede tener interfaces que son compartidos por ambos (pero el eje no sabe nada), o incluso utilizar BeanUtils.copyProperites para mantener dos objetos diferentes en sincronía.

La esperanza de que responda a su pregunta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top