JAXB无法创建抽象类的实例现在

问题描述:

@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; 
} 
} 

当我打电话从客户端与动物CALSS这种服务方法的参数时我收到错误 -JAXB无法创建抽象类的实例现在

产生的原因:javax.xml .bind.UnmarshalException:无法创建动物实例 - 带有链接的异常: [java.lang.InstantiationException] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java: 616) at 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) at org.jboss.ws.core.jaxws.JAXBDeserializer.deserialize(JAXBDeserializer.java:71)

+0

那么,你不能实例化一个抽象类的定义... – fge

+1

可能[this](http://stackoverflow.com/questions/9580028/jaxb-and-abstract-classes)有帮助吗? – NINCOMPOOP

抽象类不能被实例化,这是Java中它们的基本规则。从javadocs

抽象类是声明为abstract,它可能会或可能不会 包含抽象方法的类。抽象类不能实例化,但它们可以被分类。

Jaxb会在内部尝试将您的xml解组到java对象。但是,如果它无法创建动物的对象,它将如何工作。因此它抛出异常。您需要为JaxB提供一个非抽象类来工作。

+0

感谢您的回复。是的,我知道,但@XmlSeeAlso({Dog.class,Cat.class}) 注释我已经在我的抽象类的顶部使用。根据javadoc的说法,“指示JAXB在绑定这个类时还绑定了其他类。 Java使得列出给定类的所有子类变得不切实际/不可能,这通常会成为JAXB用户的一种方式,因为JAXB不能自动列出JAXBContext“ ” – Meastro

+0

@ user2594003你是否检查过'The New Idiot'评论中共享的链接 –

+1

yes是我知道的Juned。但我在谈论@XmlSeeAlso注解不是它应该工作的方式。 – Meastro