У меня есть схема, которая определяет следующий тип:
<xsd:complexType name="Payload">
<xsd:sequence>
<xsd:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xsd:sequence>
</xsd:complexType>
И это создает такой объект:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Payload", propOrder = {
"any"
})
public class Payload {
@XmlAnyElement(lax = true)
protected List<Object> any;
}
Теперь я пытаюсь добавить другой сгенерированный объект JAXB к этой полезной нагрузке, делая что-то вроде этого:
Class payloadClass = ...;
JAXBContext context = JAXBContext.newInstance( WrapperRequest.class, payloadClass);
...
marshaller.marshal( wrappedRequest );
Но я получаю ужасное исключение, похоже, что он никогда не будет работать, поэтому я решил сначала сериализовать объект полезной нагрузки в XML, а затем добавить его как строку в полезной нагрузке.
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance( sdoRequest.getClass() );
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(new JAXBElement(new QName("uri", sdoRequest.getClass().getSimpleName()), sdoRequest.getClass(), sdoRequest), writer);
payload.getAny().add( writer.toString() );
И это взрывается с исключением, говоря: "java.lang.String" не содержит @XmlRootElement.
Итак, как будет использоваться xs: когда-либо работайте с JAXB? Кажется, что ничего не работает, потому что JAXB превращает полезную нагрузку в объект и не будет сериализовать что-либо в объекте. Это все внутри Axis2, так что было очень сложно добраться до этого момента.