| [//]: # " Copyright (c) 2015, 2020 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: | |
| jakarta.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](https://projects.eclipse.org/projects/ee4j.grizzly) container. You can access the application at: | |
| - [http://localhost:8080/xml-moxy/customer](http://localhost:8080/xml-moxy/customer) |