2010-04-22 4 views
10

Ho un pacchetto con classi annotate JAXB con una superclasse astratta. Voglio utilizzare questa superclasse nell'interfaccia del servizio web, quindi I può passare qualsiasi sottoclasse come parametro. Quando lo faccio, viene generata un'eccezione:Java Web Services/JAXB - Superclasse astratta

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

E 'possibile manualmente Marshall/unmarshall & parametro passaggio come una stringa, ma vorrei evitarlo. Qualche idea su come farlo?

+0

non so molto di JAXB, ma ci deve essere un motivo, perché non è possibile creare alcuna istanza. Xxx.yyy.ZZZ è un costruttore pubblico senza argomenti? –

+0

'xxx.yyy.ZZZ' è il nome di una superclasse astratta dell'oggetto reale che è stata sottoposta a marshalling. La cosa brutta è che quando unmarshalling, jaxb tenta di istanziare questa superclasse invece della classe effettiva dell'oggetto che viene passato. –

+0

È xxx.yyy.ZZZ nel sistema/classpath che sta tentando di annullare la chiamata? – fish

risposta

9

Avete specificato l'implementazione concreta nella richiesta di servizio Web? Questo funziona bene per me:

astratta classe base:

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

classe di implementazione: metodo di servizio

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

Web:

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

Richiesta:

<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 mi ha salvato la vita! –

1

Stavo risolvendo lo stesso problema oggi. Ho trovato l'implementazione di EclipseLink MOXy JAXB come funzionante, ma non è disponibile un modulo jar o maven separato (è solo come intero eclipselink.jar, che è enorme) Infine ho provato l'ultima versione di JAXB (2.2.2) e sorprendentemente ha funzionato bene

Maven 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

scusate, ho sbagliato, lì MOXy in forma mavenizzata è disponibile qui: http://wiki.eclipse.org/EclipseLink/Maven –