2010-04-22 11 views
10

Ich habe ein Paket mit JAXB annotierten Klassen mit einer abstrakten Oberklasse. Ich möchte diese Oberklasse in Web-Service-Schnittstelle verwenden, so kann ich jede der Unterklassen als Parameter übergeben. Wenn ich es tun, wird eine Ausnahme ausgelöst:Java Web Services/JAXB - Abstrakte Oberklasse

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 ist möglich, manuell marshall/unmarshall & Pass Parameter als String, aber ich würde es gerne vermeiden. Irgendwelche Ideen, wie es geht?

+0

weiß nicht viel über JAXB, aber es muss einen Grund geben, warum keine Instanz erstellt werden kann. Hat xxx.yyy.ZZZ einen öffentlichen Konstruktor ohne Argumente? –

+0

'xxx.yyy.ZZZ' ist der Name einer abstrakten Oberklasse des tatsächlichen Objekts, das gemarshallt wurde. Die schlechte Sache ist, dass jaxb beim Unmarshalling versucht, diese Oberklasse anstelle der eigentlichen Klasse des übergebenen Objekts zu instanziieren. –

+0

Ist xxx.yyy.ZZZ im System/Klassenpfad, der versucht, den Aufruf zu entpacken? – fish

Antwort

9

Haben Sie die konkrete Implementierung in Ihrer Web-Service-Anfrage angegeben? Dies funktioniert gut für mich:

Abstrakte Basisklasse:

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

Implementierungsklasse:

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

Web-Service-Methode:

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

Anfrage:

<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

@XmlSeeAuch mein Leben gerettet! –

1

Ich löste das gleiche Problem heute. Ich fand EclipseLink MOXy JAXB Implementierung funktioniert, aber es ist kein separates JAR oder Maven Modul verfügbar (es ist nur als Ganzes eclipselink.jar, das ist riesig) Schließlich habe ich die neueste JAXB-Version (2.2.2) und überraschend es versucht gut gearbeitet.

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

Entschuldigung, ich lag falsch, da MOXy in mavenisierter Form hier verfügbar ist: http://wiki.eclipse.org/EclipseLink/Maven –

Verwandte Themen