Question

I have a package with JAXB annotated classes with an abstract superclass. I want to use this superclass in web service interface, so I can pass any of subclasses as a parameter. When I do it, an exception is thrown:

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

It is possible to manually marshall/unmarshall & pass parameter as a string, but I would like to avoid it. Any ideas how to do it?

Was it helpful?

Solution

Have you specified the concrete implementation in your web service request? This works fine for me:

Abstract base class:

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

Implementation class:

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

Web service method:

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

Request:

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

OTHER TIPS

I was solving the same issue today. I found EclipseLink MOXy JAXB implementation as working, but there is no separate jar or maven module available (it is only as whole eclipselink.jar, which is huge) Finally I tried the latest JAXB version (2.2.2) and surprisingly it worked well.

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>

I had a similar Problem, which the comments above didn't solve. The Blogsposts linked from InstantiationException during JAXB Unmarshalling (abstract base class, with @XmlSeeAlso concrete sub class) were very helpful for me to understand what I was really doing.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top