Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

RESTful services with JAXB and JPA

13,882 views

Published on

Published in: Technology
  • Be the first to comment

RESTful services with JAXB and JPA

  1. 1. Getting a Good REST (Service) on the Run(time) Shaun Smith Principal Product Manager, Oracle TopLink EclipseLink and Gemini Committer
  2. 2. Java Persistence: The Problem Space JAXB : Java Architecture for XML Binding <customer id=“…”> <name>…</name> … </contact-info> </customer> XML JPA : Java Persistence API CUST ID NAME C_RATING Relational Customer id: int name: String creditRating: int Java JPA JAXB DBWS
  3. 3. Use Case – Data Access Service <ul><li>In Java EE: </li></ul><ul><li>Framework - Java API for RESTful Services (JAX-RS)   </li></ul><ul><li>Message Binding - Java Architecture for XML Binding (JAXB) </li></ul><ul><li>Persistence - Java Persistence API (JPA) </li></ul>Data Access Service Data Source XML JSON Objects JPA JAXB JAXB
  4. 4. What is REST? <ul><li>REST – RE presentational S tate T ransfer </li></ul><ul><li>Priniciples: </li></ul><ul><ul><li>Addressable resources (URI per resource) </li></ul></ul><ul><ul><li>Small set of well-defined methods (i.e. GET, PUT, POST, DELETE) </li></ul></ul><ul><ul><li>Representation-oriented </li></ul></ul><ul><ul><li>Communicate statelessly </li></ul></ul>
  5. 5. What is JAX-RS? <ul><li>JAX-RS - Java API for RESTful Services </li></ul><ul><li>Principles </li></ul><ul><ul><li>Java EE framework for implementing RESTful services </li></ul></ul><ul><ul><li>Provides annotations to bind combination of URI and HTTP operation to Java methods. </li></ul></ul><ul><li>Specifications </li></ul><ul><ul><li>JAX-RS 1.0 (JSR 311) – Released October 2008 </li></ul></ul><ul><ul><li>JAX-RS 2.0 (JSR 339) – In Progress </li></ul></ul>
  6. 6. REST Service – Read (GET) <ul><li>REST GET operations correspond to JPA queries. </li></ul><ul><li>@GET </li></ul><ul><li>@Path(&quot;{id}&quot;) </li></ul><ul><li>@Produces({&quot;application/xml&quot;, &quot;application/json&quot;}) </li></ul><ul><li>public Customer read(@PathParam(&quot;id&quot;) int id) { </li></ul><ul><li>return entityManager.find(Customer.class, id); </li></ul><ul><li>} </li></ul>Relational Database JAX-RS EclipseLink JPA EclipseLink JAXB XML Document
  7. 7. REST Service – Create (POST) <ul><li>REST POST operations correspond to JPA persist </li></ul><ul><li>operations. </li></ul><ul><li>@POST </li></ul><ul><li>@Consumes({&quot;application/xml&quot;, &quot;application/json&quot;}) </li></ul><ul><li>public void create(Customer customer) { </li></ul><ul><li>entityManager.persist(customer); </li></ul><ul><li>} </li></ul>
  8. 8. REST Service – Update (PUT) <ul><li>REST PUT operations correspond to JPA merge </li></ul><ul><li>operations. </li></ul><ul><li>@PUT </li></ul><ul><li>@Consumes({&quot;application/xml&quot;, &quot;application/json&quot;}) </li></ul><ul><li>public void update(Customer customer) { </li></ul><ul><li>entityManager.merge(customer); </li></ul><ul><li>} </li></ul>
  9. 9. REST Service – Delete (DELETE) <ul><li>REST DELETE operations correspond to JPA remove </li></ul><ul><li>operations. </li></ul><ul><li>@DELETE </li></ul><ul><li>@Path(&quot;{id}&quot;) </li></ul><ul><li>public void delete(int id) { </li></ul><ul><li>Customer customer </li></ul><ul><li>= entityManager.find(Customer.class, id); </li></ul><ul><li>if(null != customer) { </li></ul><ul><li>entityManager.remove(entity); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  10. 10. Java Persistence API (JPA) & JAXB @XmlRootElement @Entity public class Customer { @XmlAttribute @Id public int getId() {…} public void setId(int id) {…} @XmlElement(name=“billing-address”) @OneToOne @JoinColumn(name=&quot;ADDR_ID&quot;) public Address getBillingAddress() {…} public void setBillingAddress(Address address) {…} } Combining JAXB and JPA Annotations
  11. 11. Pain Points – Mapping JPA Entities to XML <ul><li>Bidirectional/Cyclical Relationships </li></ul><ul><li>Composite Keys/Embedded Key Classes </li></ul>
  12. 12. Pain Points – Bidirectional Relationships <ul><li>JAXB </li></ul><ul><li>Standard JAXB does not support bidirectional relationships. One side must be marked @XmlTransient . </li></ul><ul><li>JAXB implementations may provide extensions for handling bidirectional relationships such as @XmlInverseReference(mappedBy=“foo”) in MOXy. </li></ul>
  13. 13. Pain Points – Shared References <ul><li>Privately owned references can be represented through key/foreign key relationships in XML. </li></ul><ul><li>Use @XmlID/@XmlIDREF. </li></ul>
  14. 14. Pain Points – Embedded Key Classes <ul><li>Standard JAXB does not support embedded key classes. </li></ul><ul><li>JAXB implementations such as EclipseLink MOXy offer extensions to handle this use case (mapping is the same as for composite keys). </li></ul>
  15. 15. Pain Points – Composite Keys <ul><li>Standard JAXB does not support composite keys. </li></ul><ul><li>Sample extension, EclipseLink JAXB (MOXy): </li></ul><ul><ul><li>@XmlJoinNodes({ @XmlJoinNode(xmlPath=&quot;address/@id&quot;, referencedXmlPath=&quot;@id&quot;), @XmlJoinNode(xmlPath=“address/@city&quot;, referencedXmlPath=&quot;city/text()&quot;) }) public Address address; </li></ul></ul>
  16. 16. For More Information <ul><li>EclipseLink </li></ul><ul><li>http://www.eclipse.org/eclipselink/ </li></ul><ul><li>http://wiki.eclipse.org/EclipseLink </li></ul><ul><li>bdoughan.blogspot.com </li></ul>

×