Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create java object from 'anyType' returned from service using JAXB?

Tags:

A web service is returning an object defined by the WSDL to be:

<s:complexType mixed="true"><s:sequence><s:any/></s:sequence></s:complexType> 

When I print out this object's class info, it comes up as:

class com.sun.org.apache.xerces.internal.dom.ElementNSImpl 

But I need to unmarshall this object as an object of the following class:

@XmlAccessorType(XmlAccessType.FIELD)  @XmlType(name = "", propOrder = {         "info",         "availability",         "rateDetails",         "reservation",         "cancellation",         "error" })  @XmlRootElement(name = "ArnResponse")  public class ArnResponse { } 

I know the response is correct, since I know how to marshall this object's XML:

Marshaller m = jc.createMarshaller(); m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE ); m.marshal(rootResponse, System.out); 

Which prints out:

<?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> 

How can I turn the ElementNSImpl object I'm seeing into the ArnResponse object I know it represents?

Additionally, I'm running on AppEngine, where file access is restricted.

Thanks for any help

Update:

I've added the @XmlAnyElement(lax=true) annotation, like so:

  @XmlAccessorType(XmlAccessType.FIELD)   @XmlType(name = "", propOrder = {       "content"   })   @XmlSeeAlso(ArnResponse.class)   public static class SubmitRequestDocResult {      @XmlMixed     @XmlAnyElement(lax = true)     protected List<Object> content; 

But it doesn't make any difference.

Is this something to do with the fact that the content is a List?

Here's the code where I'm trying to access the content after getting it back from the server:

List list = rootResponse.getSubmitRequestDocResult().getContent();  for (Object o : list) {   ArnResponse response = (ArnResponse) o;   System.out.println(response); } 

Which has the output:

Jan 31, 2012 10:04:14 AM com.districthp.core.server.ws.alliance.AllianceApi getRates SEVERE: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to com.districthp.core.server.ws.alliance.response.ArnResponse

Answer:

axtavt's answer did the trick. This worked:

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); 
like image 597
Cuga Avatar asked Jan 31 '12 13:01

Cuga


People also ask

How do you Unmarshal XML string to Java object using JAXB?

To unmarshal an xml string into a JAXB object, you will need to create an Unmarshaller from the JAXBContext, then call the unmarshal() method with a source/reader and the expected root object.

What is JAXB used for?

JAXB simplifies access to an XML document from a Java program by presenting the XML document to the program in a Java format. The first step in this process is to bind the schema for the XML document into a set of Java classes that represents the schema.

What is marshalling and unmarshalling in JAXB?

JAXB definitionsMarshalling is the process of transforming Java objects into XML documents. Unmarshalling is the process of reading XML documents into Java objects. The JAXBContext class provides the client's entry point to the JAXB API. It provides API for marshalling, unmarshalling and validating.


1 Answers

You can pass that object to Unmarshaller.unmarshal(Node), it should be able to unmarshal it.

like image 159
axtavt Avatar answered Oct 01 '22 07:10

axtavt