i’m new to working with SOAP API’s
I have a soap response from an API
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <LoginResponse xmlns="http://test.org/ADMail_Service"> <LoginResult> <ErrorMessage>Successful login</ErrorMessage> <Status>true</Status> </LoginResult> </LoginResponse> </soapenv:Body> </soapenv:Envelope>
I’m trying to transform this into an object.
From reading articles online I’m trying to use JAXB to do this, but my object is empty.
Here’s the code for reading the response. I wrote the response to an xml file for test purposes:
try { XMLInputFactory xif = XMLInputFactory.newFactory(); XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml")); xsr.nextTag(); // Advance to Envelope tag xsr.nextTag(); // Advance to Body tag xsr.nextTag(); xsr.nextTag(); JAXBContext jc = JAXBContext.newInstance(LoginResult.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); JAXBElement<LoginResult> je = unmarshaller.unmarshal(xsr, LoginResult.class); System.out.println(je.getName()); System.out.println(je.getValue()); } catch (XMLStreamException e) { e.printStackTrace(); } catch (JAXBException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); }
The LoginResult
class:
public class LoginResult { private String errorMessage; private String status; public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } }
Thanks in advance!
Advertisement
Answer
you can use this code to retrieve a POJO, and also add an @XmlRootElement as header to your POJO.
(I did’nt test the code below)
XMLInputFactory xif = XMLInputFactory.newFactory(); XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml")); xsr.nextTag(); // Advance to Envelope tag xsr.nextTag(); // Advance to Body tag xsr.nextTag(); xsr.nextTag(); Transformer transformer = TransformerFactory.newInstance().newTransformer(); StringWriter stringWriter = new StringWriter(); transformer.transform(new StAXSource(xsr), new StreamResult(stringWriter)); StringReader sr = new StringReader(stringWriter.toString()); JAXBContext jaxbContext = JAXBContext.newInstance(LoginResult.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); LoginResult loginResult = (LoginResult) unmarshaller.unmarshal(sr);
EDIT :
I found a solution for you:
@XmlRootElement(name = "LoginResult", namespace = "http://test.org/ADMail_Service") @XmlAccessorType(XmlAccessType.FIELD) public class LoginResult { @XmlElement(name = "ErrorMessage", namespace = "http://test.org/ADMail_Service") private String errorMessage; @XmlElement(name = "Status", namespace = "http://test.org/ADMail_Service") private String status; public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } } public static void main(String[] args) { try { XMLInputFactory xif = XMLInputFactory.newFactory(); XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml")); xsr.nextTag(); // Advance to Envelope tag xsr.nextTag(); // Advance to Body tag xsr.nextTag(); xsr.nextTag(); JAXBContext jc = JAXBContext.newInstance(LoginResult.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); JAXBElement<LoginResult> je = unmarshaller.unmarshal(xsr, LoginResult.class); System.out.println(je.getName()); System.out.println(je.getValue()); System.out.println(je.getValue().getErrorMessage()); } catch (XMLStreamException e) { e.printStackTrace(); } catch (JAXBException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } }