1
@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 をパラメーターとして使用して、エラーが発生しました-

原因: javax.xml.bind.UnmarshalException: アニマルのインスタンスを作成できません - リンクされた例外: [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) com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext) .java:583) com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:181) com.sun.xml.bind.v2.runtime.unmarshaller.XsiTypeLoader.startElement(XsiTypeLoader) .java:73) com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:455) で、com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext で。com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:71) の startElement(UnmarshallingContext.java:433) com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector. com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:240) の startElement(SAXConnector.java:137) com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:277) の場合com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:246) com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:123) com.sun.xml.bind .v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:314) 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)

4

1 に答える 1

3

抽象クラスはインスタンス化できません。これが Java の基本ルールです。javadocsから:

抽象クラスは、abstract と宣言されたクラスです。抽象メソッドが含まれる場合と含まれない場合があります。抽象クラスはインスタンス化できませんが、サブクラス化できます。

Jaxb は内部的に、xml を Java オブジェクトにアンマーシャリングしようとします。しかし、動物のオブジェクトを作成できない場合、どのように機能しますか。したがって、例外がスローされます。JaxB が機能するには、非抽象クラスを提供する必要があります。

于 2013-07-18T05:22:55.083 に答える