| [//]: # " Copyright (c) 2015, 2018 Oracle and/or its affiliates. All rights reserved. " |
| [//]: # " " |
| [//]: # " This program and the accompanying materials are made available under the " |
| [//]: # " terms of the Eclipse Distribution License v. 1.0, which is available at " |
| [//]: # " http://www.eclipse.org/org/documents/edl-v10.php. " |
| [//]: # " " |
| [//]: # " SPDX-License-Identifier: BSD-3-Clause " |
| |
| MOXy Example |
| ============ |
| |
| What is MOXy |
| ------------ |
| |
| This example demonstrates that you can utilize MOXy extensions when |
| dealing with XML representation when developing a Jersey based RESTful |
| Web application |
| |
| MOXy is EclipseLink's Object to XML Mapping services. MOXy allows for a |
| POJO object model to be mapped to an XML schema. The Java Architecture |
| for XML Binding (JAXB) provides a Java standard for object XML mapping |
| (OXM). MOXy supports JAXB, as well as providing its' own native API and |
| integration with Web Services. |
| |
| MOXy XML Path Mapping Extension |
| ------------------------------- |
| |
| The MOXy extension shown in this example is described on the Eclipse |
| Wiki site at |
| <http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions>. |
| It allows you to specify path based mapping via @XmlPath annotation. |
| |
| If the MOXy extension was not used, the XML represenation of the |
| customer data would look like follows: |
| |
| ```xml |
| <customer> |
| <name>Jane Doe</name> |
| <address> |
| <city>My Town</city> |
| <street>123 Any Street</street> |
| </address> |
| <phoneNumbers type="work">613-555-1111</phoneNumbers> |
| <phoneNumbers type="cell">613-555-2222</phoneNumbers> |
| </customer> |
| ``` |
| |
| By adding `@org.eclipse.persistence.oxm.annotations.XmlPath` annotation |
| to the bean definition classes, you will get the following XML |
| representation instead: |
| |
| ```xml |
| <customer> |
| <personal-info> |
| <name>Jane Doe</name> |
| </personal-info> |
| <contact-info> |
| <address> |
| <city>My Town</city> |
| <street>123 Any Street</street> |
| </address> |
| <phone-number type="work">613-555-1111</phone-number> |
| <phone-number type="cell">613-555-2222</phone-number> |
| </contact-info> |
| </customer> |
| ``` |
| |
| XML Path expressions used are: |
| |
| - personal-info/name/text() |
| - contact-info/address |
| - contact-info/phone-number |
| |
| Please check out the source code and the wiki page linked above for the |
| detailed information on the XML Path mapping feature. |
| |
| Replacing Implicit JAXB Runtime With MOXy |
| ----------------------------------------- |
| |
| Since MOXy is a JAXB implementation, the example still utilizes the |
| standard Jersey JAXB message body reader/writer providers. To make |
| Jersey use MOXy runtime, you just need to put a `jaxb.properties` file |
| into the Java package containing your JAXB beans. The file should have |
| the following content: |
| |
| javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory |
| |
| Concrete file used in this example is placed under |
| |
| src/main/resources/com/sun/jersey/samples/moxy/beans/jaxb.properties |
| |
| Contents |
| -------- |
| |
| The example consists of a single REST Resource represented by the |
| following Java class: |
| |
| org.glassfish.jersey.examples.xmlmoxy.CustomerResource |
| |
| A resource class that maintains a single customer data. |
| |
| The mapping of the URI path space is presented in the following table: |
| |
| URI path | Resource class | HTTP methods |
| ---------------- | ------------------ | -------------- |
| **_/customer_** | CustomerResource | GET, PUT |
| |
| Running the Example |
| ------------------- |
| |
| Run the example as follows: |
| |
| > mvn clean compile exec:java |
| |
| This deploys the example using [Grizzly](http://grizzly.java.net/) container. You can access the application at: |
| |
| - [http://localhost:8080/moxy/customer](http://localhost:8080/xml-moxy/customer) |