Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

EclipseLink MOXy is the JAXB Provider in WebLogic Server 12c

DZone's Guide to

EclipseLink MOXy is the JAXB Provider in WebLogic Server 12c

· Java Zone
Free Resource

Bitbucket is for the code that takes us to Mars, decodes the human genome, or drives your next car. What will your code do? Get started with Bitbucket today, it's free.

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.

WebLogic Server 12c can be downloaded from OTN at the following link:


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".

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>

 

From http://blog.bdoughan.com/2011/12/eclipselink-moxy-is-jaxb-provider-in.html

Bitbucket is the Git solution for professional teams who code with a purpose, not just as a hobby. Get started today, it's free.

Topics:

Opinions expressed by DZone contributors are their own.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

X

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}