org - generación de ejes wsdl
generate stub from wsdl axis2 (1)
Para explicar el problema que está enfrentando, es útil pensar en lo que Axis debe hacer cuando se llame a su servicio.
Axis es simplemente una aplicación web java ... cuando recibe una solicitud de un servicio, buscará la asignación que hayas definido para ella. Si encuentra una asignación, intenta crear una instancia de las clases necesarias que ha definido para atender la solicitud.
Si ha definido las clases como abstractas o como interfaces, obtendrá InstantiationExceptions, ya que estos tipos no se pueden crear. Cuando Axis intentó crear el wsdl, no podrá determinar qué tipo poner para que use "anyType".
Para responder a su pregunta: PUEDE usar el modelo que tiene arriba en su código, pero no podrá usar estas clases con Axis. Lo que típicamente hemos hecho en nuestros proyectos es:
- Definir las clases que necesitamos, como lo haríamos en una aplicación típica orientada a objetos
- Defina clases "solo transporte" que se usan para servicios web. Estas clases se componen de tipos simples y se pueden crear fácilmente. Solo se usan para intercambiar mensajes del servicio web. Usamos estas clases con Axis.
- Encuentre alguna forma para que estos dos tipos de clases compartan / intercambien información fácilmente. Puede tener interfaces compartidas por ambos (pero Axis no lo sabe) o incluso usar BeanUtils.copyProperites para mantener dos objetos diferentes sincronizados.
Espero que responda tu pregunta.
Estoy usando Axis para modelar un WebService de muestra. Lo que estoy haciendo ahora es tratar de entender cuáles son las limitaciones de la automatización wsdl y generación de código.
Ahora para un código del lado del servidor:
este es el esqueleto del servicio web de muestra:
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 está feliz de generar un wsdl a partir de estas fuentes, incluido 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 ve algo extraño aquí, AbstractAttribute no tiene el atributo ** abstract = "true" ** y define un elemento de valor anyType, que obtiene la reescritura en IntAttribute y StirngAttribute. Ni siquiera sé si esto es un esquema legal (no creo que sea legal, por cierto).
Más aún, si trato de generar un cliente a partir de este wsdl (siempre usando las herramientas eclipse) las fuentes generadas no se compilarán, porque AbstractAttribute define un
Object localValue;
campo e Int / String Attribute define
int localValue;
y
String localValue;
..Intenté "acomodar" las fuentes (sin muchas esperanzas, obviamente), y los resultados son que el servidor intenta crear una instancia de AbstractAttribute (lanzando una InstantiationException).
Entonces mi pregunta es: ¿hay alguna manera de modelar algo como el modelo de datos anterior, o los servicios web y los esquemas XML en general no son las mejores herramientas para usar en este caso particular?