RESTful Data Access Services with Java EE

3,204
-1

Published on

A v

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,204
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
90
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

RESTful Data Access Services with Java EE

  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>

×