javax.xml.bind.MarshalException с типом: anyType - PullRequest
0 голосов
/ 20 сентября 2019

Я пишу на стороне сервера мыла WS с помощью весенней загрузки.XSDS предоставлен клиентами.Согласно одному из xsds, есть элемент с типом: anyType.Так что это может быть любой сложный тип, представляющий другие классы.

Вот xsds:

    <?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://targetspace.../Response"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="ResponseData">
        <xsd:sequence>
            <xsd:element minOccurs="0" name="data" type="xsd:anyType"></xsd:element>
        </xsd:sequence>
    </xsd:complexType> 
</xsd:schema>

<xs:schema xmlns:ns1="http://namespace/model" targetNamespace="http://targetnamespace/model/document" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:import namespace="http://namespace/model/document" />
    <xs:complexType name="document">
        <xs:complexContent mixed="false">
            <xs:extension base="ns1:info">
                <xs:sequence>
                    <xs:element minOccurs="0" name="name" type="xs:string"/>
                    <xs:element minOccurs="0" name="type" type="xs:string"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>  

И POJO следующие:

package namespace.response;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "ResponseData",
    propOrder = {"data"}
)
public class ResponseData {
    protected Object data;

    public ResponseData() {
    }

    public Object getData() {
        return this.data;
    }

    public void setData(Object value) {
        this.data = value;
    }
}

package namespace.model.document;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import namespace.model.Info;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "document",
    propOrder = {"name", "type"}
)
public class Document extends Info {

    protected String name;
    protected String type;

    public Document() {
    }

    public String getName() {
        return this.name;
    }

    public void setName(String value) {
        this.name= value;
    }

    public String getType() {
        return this.type;
    }

    public void setType(String value) {
        this.type = value;
    }
}

Что мне нужно, чтобыпредоставить объект Document (или другие объекты) вместо объекта Object в ResponseData в качестве ответа при вызове службы.

ResponseData response = new ResponseData();
Document document = new Document();
document.setName("Name");
document.setType("Type");
resposne.setData(document);

Когда я запускаю службу и пытаюсь проверить ее, я получил следующее исключение:

javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.internal.SAXException2: class namespace.model.document.Document nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class namespace.model.document.Document nor any of its super class is known to this context.]

Я ожидаю такого ответа:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <SendMessage xmlns="http://namespace/Types">
    <responseData>
     <data xmlns:ns1="http://namespace/model/document" xsi:type="ns1:document">
      <name>Name</name>
      <type>Type</type>
     </data>
    </responseData>
   </SendMessage>
 </soapenv:Body>
</soapenv:Envelope>

Кто-нибудь может мне помочь с этим?Я что-то пропустил?

...