2010-04-22 23 views
10

Tengo un paquete con clases anotadas JAXB con una superclase abstracta. Quiero utilizar esta superclase en la interfaz del servicio web, por lo que I puede pasar cualquiera de las subclases como parámetro. Cuando lo hago, se produce una excepción:Java Web Services/JAXB - Superclase abstracta

javax.xml.ws.WebServiceException: javax.xml.bind.UnmarshalException 
- with linked exception: 
[javax.xml.bind.UnmarshalException: Unable to create an instance of xxx.yyy.ZZZ 
- with linked exception: 
[java.lang.InstantiationException]] 

Es posible manualmente Marshall/Resolver referencia & parámetro pase como una cadena, pero me gustaría evitarlo. ¿Alguna idea de como hacerlo?

+0

no sé mucho sobre JAXB, pero debe haber una razón, por qué no se puede crear ninguna instancia. ¿Tiene xxx.yyy.ZZZ un constructor público sin argumento? –

+0

'xxx.yyy.ZZZ' es el nombre de una superclase abstracta del objeto real que se ha ordenado. Lo malo es que, al desasociar, jaxb intenta crear una instancia de esta superclase en lugar de la clase real del objeto que se pasa. –

+0

¿Está xxx.yyy.ZZZ en el sistema/classpath que intenta deshacer la llamada? – fish

Respuesta

9

¿Ha especificado la implementación concreta en su solicitud de servicio web? Esto funciona muy bien para mí:

clase base abstracta:

@XmlSeeAlso({Foo.class, Bar.class}) 
public abstract class FooBase 
{ 
    ... 
} 

clase de implementación: método de servicio

@XmlRootElement(name = "foo") 
public class Foo extends FooBase 
{ 
    ... 
} 

Web:

public String getFoo(@WebParam(name = "param") final FooBase foo) 
{ 
    ... 
} 

Solicitud:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.example/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ser:getFoo> 
     <param xsi:type="ser:foo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
     </ser:getFoo> 
    </soapenv:Body> 
</soapenv:Envelope> 
+2

@XmlSeeAlso me salvó la vida! –

1

Estaba resolviendo el mismo problema hoy. Encontré que la implementación de EclipseLink MOXy JAXB funcionaba, pero no hay un módulo jar o maven por separado disponible (solo es eclipselink.jar completo, que es enorme) Finalmente, probé la última versión de JAXB (2.2.2) y, sorprendentemente, funcionado bien.

experto config:

<dependency> 
     <groupId>javax.xml.bind</groupId> 
     <artifactId>jaxb-api</artifactId> 
     <version>2.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.xml.bind</groupId> 
     <artifactId>jaxb-impl</artifactId> 
     <version>2.2.2</version> 
    </dependency> 
+0

lo siento, estaba equivocado, allí MOXy en forma mavenizada está disponible aquí: http://wiki.eclipse.org/EclipseLink/Maven –

Cuestiones relacionadas