简体   繁体   English

jaxb无法创建抽象类的实例

[英]jaxb unable to create an instance of abstract class

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

Now when i am calling this service method from client with Animal calss as a parameter that time i am getting error- 现在,当我从客户端调用此服务方法时,将Animal calss作为参数,当时我收到错误 -

Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of Animal - with linked exception: [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.unmarsh 引发者: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)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)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)com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:71)at com.sun.xml.bind.v2.runtime.unmarsh aller.SAXConnector.startElement(SAXConnector.java:137) at com.sun.xml.bind.unmarshaller.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) aller.sAXConnector.startElement(SAXConnector.java:137)at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:240)at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner。 java:277)com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:246)at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:123)at com.sun com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:293)的com.sun中的.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:314) org.jboss.ws.core.jaxws.JAXBDeserializer.deserialize中的.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:244)(JAXBDeserializer.java:71)

Abstract classes cannot be instantiated, that is the basic rule for them in Java. 抽象类无法实例化,这是Java中的基本规则。 From the javadocs : 来自javadocs

An abstract class is a class that is declared abstract—it may or may not include abstract methods. 抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。 Abstract classes cannot be instantiated, but they can be subclassed. 抽象类无法实例化,但可以进行子类化。

Jaxb internally will try to unmarshall your xml to the java object. Jaxb内部将尝试将您的xml解组为java对象。 But if it is not able to create an object of Animal, how will it work. 但如果它无法创建Animal的对象,它将如何工作。 Hence it throws the exception. 因此它抛出异常。 You need to provide a non-abstract class to JaxB to work. 您需要为JaxB提供非抽象类才能工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM