java - jaxb 无法创建抽象类的实例

标签 java web-services

@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/

相关文章:

java - 使用 jFreeChart 的多个图形中的多个图形

java - 在 MapReduce 作业中使用 selenium 对 Hadoop 有好处吗?

c# - 使用 RestSharp 将 GET 参数添加到 POST 请求

python - HTTLlib2 是否支持 NTLM 身份验证。如果没有具体解释?

java - 我可以在 Android 谷歌地图 API 中设置折线不透明度吗

java - 如何为我的软件制作上下文菜单?

javascript - 如何为 webservice api 创建按钮?

android - 移动应用程序最好的 Web 服务器技术是什么?

c# - File.ReadAllText 线程安全吗?

java - 使用三元运算符时出错