2010-04-22 2 views
10

У меня есть пакет с аннотированными классами JAXB с абстрактным суперклассом. Я хочу использовать этот суперкласс в интерфейсе веб-сервиса, поэтому I может передать любой из подклассов в качестве параметра. Когда я это делаю, то создается исключение:Java Web Services/JAXB - Аннотация суперкласс

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

можно вручную маршал/маршализация & параметра проходит в виде строки, но я хотел бы избежать. Есть идеи, как это сделать?

+0

не знаю много о JAXB, но должна быть причина, почему экземпляр не может быть создан. Имеет xxx.yyy.ZZZ публичный конструктор аргументов? –

+0

'xxx.yyy.ZZZ' - это имя абстрактного суперкласса фактического объекта, который был настроен. Плохо то, что при unmarshalling jaxb пытается создать экземпляр этого суперкласса вместо фактического класса передаваемого объекта. –

+0

Является xxx.yyy.ZZZ в пути system/classpath, который пытается размонтировать вызов? – fish

ответ

9

Вы указали конкретную реализацию в запросе веб-службы? Это отлично работает для меня:

Абстрактный базовый класс:

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

класс реализации:

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

Web метод сервиса:

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

Запрос:

<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 спас мою жизнь! –

1

Я решал ту же проблему сегодня. Я нашел реализацию EclipseLink MOXy JAXB как работающую, но нет отдельного модуля jar или maven (это всего лишь целый eclipselink.jar, который огромен) Наконец, я попробовал последнюю версию JAXB (2.2.2) и на удивление это хорошо работал.

Maven конфигурации:

<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

извините, я ошибся, там MOXy в mavenized форме доступен здесь: http://wiki.eclipse.org/EclipseLink/Maven –