2013-07-18 3 views
0
@XmlSeeAlso({ Dog.class, Cat.class }) 
public abstract class Animal {} 

@XmlRootElement(name="dog") 
public class Dog extends Animal {} 

@XmlRootElement(name="cat") 
public class Cat extends Animal {} 

@WebService(name = "WebServiceDemo", serviceName = "WebServiceDemo") 
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, 
      parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
public class WebServiceDemo { 

@WebMethod 
public String service(@WebParam(name = "animal") Animal animal) { 
     System.out.println("animal service calling....."); 
     return animal; 
} 
} 

Теперь, когда я звоню этот метод обслуживания от клиента с Animal Calss в качестве параметра это время я получаю error-JAXB не удалось создать экземпляр абстрактного класса

Вызванный: javax.xml .bind.UnmarshalException: невозможно создать экземпляр Animal - со связанным исключением: [java.lang.InstantiationException] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent (UnmarshallingContext.java: 616) по адресу com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError (Loader.java:244) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance (UnmarshallingContext.java:583) at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.startElement (StructureLoader.java: 181) at com.sun.xml.bind.v2.runtime.unmarshaller.XsiTypeLoader.startElement (XsiTypeLoader.java:73) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement (UnmarshallingContext. java: 455) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement (UnmarshallingContext.java:433) at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement (InterningXmlVisitor.java:71) at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement (SAXConnector.java:137) at com.sun.xml.bind.unmarshalle r.DOMScanner.visit (DOMScanner.java:240) at com.sun.xml.bind.unmarshaller.DOMScanner.visit (DOMScanner.java:277) at com.sun.xml.bind.unmarshaller.DOMScanner.visit (DOMScanner.java:246) at com.sun.xml.bind.unmarshaller.DOMScanner.scan (DOMScanner.java:123) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0 (UnmarshallerImpl. java: 314) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal (UnmarshallerImpl.java:293) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal (UnmarshallerImpl.java:244) на org.jboss.ws.core.jaxws.JAXBDeserializer.deserialize (JAXBDeserializer.java:71)

+0

Ну, вы не можете создать экземпляр абстрактного класса по определению ... – fge

+1

Может быть [это] (http://stackoverflow.com/questions/9580028/jaxb-and-abstract-classes) помогает? – NINCOMPOOP

ответ

2

Абстрактные классы не могут быть созданы, это основное правило для них в Java. Из javadocs:

Абстрактный класс является классом, который объявлен абстрактно-это может быть или не включают в себя абстрактные методы. Абстрактные классы не могут быть созданы, , но они могут быть подклассифицированы.

Jaxb внутренне попытается развязать ваш xml объекту java. Но если он не может создать объект Animal, как он будет работать. Следовательно, это исключает. Вам нужно предоставить не-абстрактный класс для работы JaxB.

+0

Спасибо за ваш ответ. да, я знаю это, но @XmlSeeAlso ({Dog.class, Cat.class}) аннотация, которую я использовал в верхней части моего абстрактного класса. Согласно javadoc «Instruct JAXB также связывает другие классы при привязке этого класса. Java делает невозможным/невозможно отобразить все подклассы данного класса. Это часто встречается у пользователей JAXB, так как JAXB не может автоматически перечислить список которые должны быть известны JAXBContext. « – Meastro

+0

@ user2594003 Вы проверили ссылку, разделяемую в комментариях 'The New Idiot' –

+1

yes Juned, что я знаю.но я говорю о @XmlSeeAlso аннотация не работает так, как она должна работать. – Meastro

Смежные вопросы