2011-02-09 9 views
9

que tienen este sencillo servicio Web JAX-WS:polimórfica servicio web JAX-WS parámetros

@WebService 
public class AnimalFeedingService { 
    @WebMethod 
    public void feed(@WebParam(name = "animal") Animal animal) { 
     // Whatever 
    } 
} 

@XmlSeeAlso({ Dog.class, Cat.class }) 
public abstract class Animal { 
    private double weight; 
    private String name; 
    // Also getters and setters 
} 

public class Dog extends Animal {} 

public class Cat extends Animal {} 

puedo crear un cliente y llaman feed con una instancia de Dog.

Animal myDog = new Dog(); 
myDog .setName("Rambo"); 
myDog .setWeight(15); 
feedingServicePort.feed(myDog); 

El animal en el cuerpo de la llamada SOAP tiene el siguiente aspecto:

<animal> 
    <name>Rambo</name> 
    <weight>15</weight> 
</animal> 

y me sale un UnmarshallException porque Animal es abstracta.

¿Hay alguna manera de desarticular Rambo como una instancia de la clase Dog? ¿Cuáles son mis alternativas?

Respuesta

6

Como debe haber adivinado, el analizador XML no puede determinar el subtipo exacto de animal que utilizó al solicitarlo, ya que todo lo que ve es genérico <animal> y un conjunto de etiquetas comunes a todos los tipos, de ahí el error. ¿Qué implementación de JAX-WS usas? Es responsabilidad del cliente ajustar adecuadamente los tipos polimórficos al enviar la solicitud. En Apache CXF (he comprobado su código contra la nueva versión 2.3.2) la solicitud cuerpo SOAP es el siguiente:

<animal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:dog"> 
    <name>Rambo</name> 
    <weight>15.0</weight> 
</animal> 

El xsi:type="ns2:dog" es crucial aquí. Parece que su cliente JAX-WS está enviando una solicitud incorrecta que confunde el servidor. Intente enviar esta solicitud con algún otro cliente, como SoapUI, para ver si su servidor reacciona correctamente.

Como ya he dicho, funciona muy bien con la primavera/Apache CXF y exactamente el mismo código que nos ha proporcionado, interfaz Java sólo se extrae a hacer feliz CXF:

public interface AnimalFeedingService { 

    @WebMethod 
    void feed(@WebParam(name = "animal") Animal animal); 

} 

@WebService 
@Service 
public class AnimalFeedingServiceImpl implements AnimalFeedingService { 
    @Override 
    @WebMethod 
    public void feed(@WebParam(name = "animal") Animal animal) { 
     // Whatever 
    } 
} 

... y el servidor/código de cliente de pegamento:

<jaxws:endpoint implementor="#animalFeedingService" address="/animal"/> 

<jaxws:client id="animalFeedingServiceClient" 
       serviceClass="com.blogspot.nurkiewicz.test.jaxws.AnimalFeedingService" 
       address="http://localhost:8080/test/animal"> 
</jaxws:client> 
+0

Usando xsi: tipo de SoapUI funcionó, el problema debe estar en mi cliente. Gracias. – adrianboimvaser

Cuestiones relacionadas