I am very happy to announce that EclipseLink JAXB (MOXy) is now the default JAXB (JSR-222) provider in WebLogic Server 12c. I would like to thank the EclipseLink committers and the WebLogic team for all their hard work to make this happen.
In this post I will introduce how MOXy can be leveraged to create a JAX-WS service. In future posts I will cover more of the extensions in greater detail.
In this post I will introduce how MOXy can be leveraged to create a JAX-WS service. In future posts I will cover more of the extensions in greater detail.
Web Service (JAX-WS)
For this post we will implement a simple service that finds a customer by ID. As this is just a "Hello World" type example the service will always return a customer with the name "Jane Doe".
For this post we will implement a simple service that finds a customer by ID. As this is just a "Hello World" type example the service will always return a customer with the name "Jane Doe".
package blog.jaxws.service; import javax.jws.*; import blog.jaxws.model.Customer; @WebService public class FindCustomer { @WebMethod public Customer findCustomer(int id) { Customer customer = new Customer(); customer.setId(id); customer.setFirstName("Jane"); customer.setLastName("Doe"); return customer; } }
Model
Since MOXy is the default JAXB provider we can leverage all of its mapping extensions. In this example we will use @XmlPath to do XPath based mapping.
package blog.jaxws.model; import javax.xml.bind.annotation.*; import org.eclipse.persistence.oxm.annotations.XmlPath; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder={"firstName", "lastName"}) public class Customer { @XmlAttribute private int id; @XmlPath("personal-info/first-name/text()") private String firstName; @XmlPath("personal-info/last-name/text()") private String lastName; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
WSDL
Below is the WSDL that was generated for this service:
<?xml version="1.0" encoding="UTF-8"?> <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.6hudson-86 svn-revision#12773. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.6hudson-86 svn-revision#12773. --> <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.jaxws.blog/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service.jaxws.blog/" name="FindCustomerService"> <types> <xsd:schema> <xsd:import namespace="http://service.jaxws.blog/" schemaLocation="http://www.example.com:7001/Blog-JAXWS/FindCustomerService?xsd=1" /> </xsd:schema> </types> <message name="findCustomer"> <part name="parameters" element="tns:findCustomer" /> </message> <message name="findCustomerResponse"> <part name="parameters" element="tns:findCustomerResponse" /> </message> <portType name="FindCustomer"> <operation name="findCustomer"> <input wsam:Action="http://service.jaxws.blog/FindCustomer/findCustomerRequest" message="tns:findCustomer" /> <output wsam:Action="http://service.jaxws.blog/FindCustomer/findCustomerResponse" message="tns:findCustomerResponse" /> </operation> </portType> <binding name="FindCustomerPortBinding" type="tns:FindCustomer"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="findCustomer"> <soap:operation soapAction="" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <service name="FindCustomerService"> <port name="FindCustomerPort" binding="tns:FindCustomerPortBinding"> <soap:address location="http:/www.example.com:7001/Blog-JAXWS/FindCustomerService" /> </port> </service> </definitions>
XML Schema
Below is the XML schema referenced by the WSDL that was generated for the model. Notice how it includes the "personal-info" element that was specified in the @XmlPath annotation.
<?xml version="1.0" encoding="UTF-8"?> <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.6hudson-86 svn-revision#12773. --> <xsd:schema xmlns:ns0="http://service.jaxws.blog/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://service.jaxws.blog/"> <xsd:complexType name="findCustomerResponse"> <xsd:sequence> <xsd:element name="return" type="ns0:customer" minOccurs="0" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="findCustomer"> <xsd:sequence> <xsd:element name="arg0" type="xsd:int" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="customer"> <xsd:sequence> <xsd:element name="personal-info" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="first-name" type="xsd:string" minOccurs="0" /> <xsd:element name="last-name" type="xsd:string" minOccurs="0" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="id" type="xsd:int" use="required" /> </xsd:complexType> <xsd:element name="findCustomerResponse" type="ns0:findCustomerResponse" /> <xsd:element name="findCustomer" type="ns0:findCustomer" /> </xsd:schema>
Service Request
Below is what a request to our service looks like:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header /> <env:Body> <findCustomer xmlns="http://service.jaxws.blog/"> <arg0 xmlns="">123</arg0> </findCustomer> </env:Body> </env:Envelope>
Service Response
The response leverages the @XmlPath annotation we used on the Customer class to map the firstName and lastName properties to XML.
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns0:findCustomerResponse xmlns:ns0="http://service.jaxws.blog/"> <return id="123"> <personal-info> <first-name>Jane</first-name> <last-name>Doe</last-name> </personal-info> </return> </ns0:findCustomerResponse> </S:Body> </S:Envelope>
Further Reading
If you enjoyed this post, then you may be interested in:
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.