mam schematu, który określa następujące rodzaje:Szeregowania z JAXB i Dowolna
<xsd:complexType name="Payload">
<xsd:sequence>
<xsd:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xsd:sequence>
</xsd:complexType>
I to tworzy obiekt tak:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Payload", propOrder = {
"any"
})
public class Payload {
@XmlAnyElement(lax = true)
protected List<Object> any;
}
Teraz próbuję dodać kolejny wygenerowany obiekt JAXB do Ładunek, który robi coś takiego:
Class payloadClass = ...;
JAXBContext context = JAXBContext.newInstance(WrapperRequest.class, payloadClass);
...
marshaller.marshal(wrappedRequest);
Ale mam straszny wyjątek, który wygląda jak to będzie nigdy wor k więc decyduję się najpierw serializować obiekt ładunku na XML, a następnie dodać go jako ciąg znaków w polu danych.
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());
A to wysadza się z wyjątkiem, mówiąc "java.lang.String" nie zawiera @XmlRootElement.
Jak zatem korzystać z xs: kiedykolwiek współpracować z JAXB? Wydaje się, że nic nie chce działać, ponieważ JAXB zmienia ładunek w obiekt i nie będzie serializować niczego w Object. To wszystko jest również w Axis2, więc dotarcie do tego punktu było bardzo trudne.
Jakiego wyjątku otrzymujesz, próbując dodać zawinięty obiekt do dowolnego ładunku danych? – gregwhitaker
Poniższe informacje powinny pomóc: http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html –
Częściowo w jaki sposób tworzone są WSDL, na które mam zerową kontrolę. Jednak żądanie opakowywania jest zdefiniowane w jednym pliku WSDL, a żądanie w polu danych jest zdefiniowane w innym pliku WSDL. Obaj deklarują BaseRequest, ale kiedy generowany jest kod, są to różne klasy. I otrzymuję ten wyjątek Dwie klasy mają tę samą nazwę typu XML {http://esp.lala.com/2012/eo}BaseRequest. Użyj @ XmlType.name i @ XmlType.namespace, aby przypisać im różne nazwy. – chubbsondubs