- marshal. Consiste en presentar un objeto Java en XML. Java Object > XML
- unmarshal. Consiste en presentar XML en un objeto Java. XML > Java Object
Esta versión trabaja con anotaciones con las cuáles se indica cuál será la raíz del documento XML, los elementos y los atributos. Las principales anotaciones son:
- @XmlRootElement
- @XmlElement
- @XmlAttribute
package com.blogspot.ingmmurillo.axisws; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import java.io.IOException; import java.io.OutputStream; import java.io.Serializable; @XmlRootElement public class Message implements Serializable { private Field[] fields; private String from; private String to; @XmlAttribute public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } @XmlAttribute public String getTo() { return to; } public void setTo(String to) { this.to = to; } public Field[] getFields() { return fields; } public void setFields(Field[] fields) { this.fields = fields; } @Override public String toString() { OutputStream xmlOutput = new OutputStream() { private StringBuilder string = new StringBuilder(); @Override public void write ( int b) throws IOException { this.string.append((char) b); } @Override public String toString () { return this.string.toString(); } }; JAXBContext contextObj = null; Marshaller marshallerObj = null; try { contextObj = JAXBContext.newInstance(Message.class); marshallerObj = contextObj.createMarshaller(); marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshallerObj.marshal(this, xmlOutput); xmlOutput.flush(); xmlOutput.close(); } catch (JAXBException e) { e.printStackTrace(); return e.getMessage(); } catch (IOException e) { e.printStackTrace(); return e.getMessage(); } finally { if (contextObj != null) { contextObj = null; } if (marshallerObj != null) { marshallerObj = null; } } return xmlOutput.toString(); } }
Al realizar la invocación del servicio web la respuesta obtenida es la siguiente:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:sendMessageResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ingmmurillo.blogspot.com/webservices/axis"> <sendMessageReturn xsi:type="xsd:string"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <message to="The World" from="My Blog"> <fields> <name>FirstName</name> <value>Mauricio</value> </fields> <fields> <name>LastName</name> <value>Mauricio</value> </fields> </message>]]></sendMessageReturn> </ns1:sendMessageResponse> </soapenv:Body> </soapenv:Envelope>
El XML de respuesta ahora fue generado automáticamente usando JAXB. En conclusión, JAXB permite ahorrar tiempo para realizar los procesos de marshal y unmarshal. Además, JAXB permite que el mantenimiento de un bean sea menos costoso, ayudando a los desarrolladores a trabajar de forma más ágil.
Que tal , me ha parecido interesante pero tengo un problema y no se si podrias ayudarme... anteriormente he utilizado Web services pero generaba el cliente a partir de la URl donde se encontraba el wsdl, ahora al generar los objetos a partir de .wsd no me queda clara la manera de invocar a mi servicio web no se si podrias darme alguna pista ya que acabo de comenzar a ver JAXB hace un par de días y estoy un poco perdida. Cualquier ayuda se agradece un saludo.
ResponderEliminarQue tal Maria. Bueno JAXB es una tecnologia para mapear objetos a representaciones XML las tecnologias Java para Web Services mas usadas son Apache CXF y Apache AXIS estas usan por detrás ésta tecnología. Lo que tú primero necesitas hacer es generar el cliente del servicio web, observa el siguiente post: Tarea Ant Servicios Web
ResponderEliminarUna vez creado el cliente del servicio web podrías consumirlo de la siguiente forma:
public static void main(String[] args) {
try {
CurrencyConvertorLocator wsLocator = new CurrencyConvertorLocator();
CurrencyConvertorSoap_PortType ws = wsLocator.getCurrencyConvertorSoap();
double tasaConversion = ws.conversionRate(Currency.USD, Currency.COP);
System.out.println("tasaConversion = " + tasaConversion + " Pesos Colombianos, 1 USD");
} catch (ServiceException e) {
System.err.println(e);
} catch (RemoteException e) {
System.err.println(e);
}
}
Saludos,
Muchas gracias por el post.
ResponderEliminarUsamos JAXB para todos los proyectos y realmente es muy fácil y performante.
Lo recomiendo para todos aquellos que requieran realizar mapeos de objetos a XML y viceversa.
Muy bueno el blog, felicitaciones !
Buenas tardes, me encuentro utilizando marshall para generar XMLś dinamicos, necesito quitar o que no me muestre en el Xml que genera el : xsi:type=XXXXXX
ResponderEliminarAlguien puede ayudarme?
Muchas gracias. Saludos