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.