Я пишу на стороне сервера мыла 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>
Кто-нибудь может мне помочь с этим?Я что-то пропустил?