@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 类作为参数从客户端调用此服务方法时,出现了错误-
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.unmarshaller.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)
最佳答案
抽象类不能被实例化,这是Java中的基本规则。来自javadocs :
An abstract class is a class that is declared abstract—it may or may not include abstract methods. Abstract classes cannot be instantiated, but they can be subclassed.
Jaxb 将在内部尝试将您的 xml 解码为 java 对象。但是,如果它不能创建 Animal 对象,它将如何工作。因此它抛出异常。您需要为 JaxB 提供一个非抽象类才能工作。
关于java - jaxb 无法创建抽象类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17715063/