serwis internetowy wraca obiekt zdefiniowany przez WSDL być:Jak utworzyć obiekt java z "anyType" zwrócony z usługi przy użyciu JAXB?
<s:complexType mixed="true"><s:sequence><s:any/></s:sequence></s:complexType>
Kiedy wydrukować informacje o klasie tego obiektu, to pojawia się jako:
class com.sun.org.apache.xerces.internal.dom.ElementNSImpl
Ale muszę wycofać ten obiekt jako obiekt poniższej klasy:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"info",
"availability",
"rateDetails",
"reservation",
"cancellation",
"error" })
@XmlRootElement(name = "ArnResponse")
public class ArnResponse { }
wiem, że odpowiedź jest poprawna, ponieważ wiem, jak XML Marszałkowskiego tego obiektu:
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(rootResponse, System.out);
Który wypisuje:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:SubmitRequestDocResponse xmlns:ns2="http://tripauthority.com/hotel">
<ns2:SubmitRequestDocResult>
<!-- below is the object I'm trying to unmarshall -->
<ArnResponse>
<Info />
<Availability>
<!-- etc-->
</Availability>
</ArnResponse>
</ns2:SubmitRequestDocResult>
</ns2:SubmitRequestDocResponse>
Jak mogę obrócić obiekt ElementNSImpl
widzę do obiektu ArnResponse
wiem, że to oznacza?
Dodatkowo używam AppEngine, gdzie dostęp do plików jest ograniczony.
Dzięki za wszelką pomoc
aktualizacji:
Dodałem @XmlAnyElement(lax=true)
adnotacji, tak jak poniżej:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"content"
})
@XmlSeeAlso(ArnResponse.class)
public static class SubmitRequestDocResult {
@XmlMixed
@XmlAnyElement(lax = true)
protected List<Object> content;
Ale to nie robi żadnej różnicy.
Czy ma to coś wspólnego z tym, że treść jest List
?
Oto kod gdzie usiłuję dostępu do treści po otrzymaniu go z powrotem z serwera:
List list = rootResponse.getSubmitRequestDocResult().getContent();
for (Object o : list) {
ArnResponse response = (ArnResponse) o;
System.out.println(response);
}
który ma wyjście:
31 stycznia 2012 10:04: 14 AM com.districthp.core.server.ws.alliance.AllianceApi getRATE SEVERE: com.sun.org.apache.xerces.internal.dom.ElementNSImpl nie można przesłać na adres com.districthp.core.server.ws. alliance.response.ArnResponse
Odpowiedź: Odpowiedź
axtavt za załatwiło sprawę. To działało:
Object content = ((List)result.getContent()).get(0);
JAXBContext context = JAXBContext.newInstance(ArnResponse.class);
Unmarshaller um = context.createUnmarshaller();
ArnResponse response = (ArnResponse)um.unmarshal((Node)content);
System.out.println("response: " + response);
Mam kopie wszystkich schematów dla obiektów odpowiedzi i WSDL, jeśli pomaga to wiedzieć. – Cuga
Należy zauważyć, że użyty tutaj 'Node' to' org.w3c.dom.Node'. –