JAX-RS 2.0: RESTful Java on Steroids, by Aron Gupta
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

JAX-RS 2.0: RESTful Java on Steroids, by Aron Gupta

on

  • 1,695 views

The purpose of this technical session is to elaborate on all the new features being discussed in JAX-RS 2.0. The most commonly requested feature for JAX-RS 2.0 is a client API. Client APIs can range ...

The purpose of this technical session is to elaborate on all the new features being discussed in JAX-RS 2.0. The most commonly requested feature for JAX-RS 2.0 is a client API. Client APIs can range from low-level, just above HttpURLConnection, to high-level, often including support for IoC and hyperlinking. Other features this presentation covers are hypermedia, MVC, validation, interceptors, improved content negotiation, and better integration with other specifications such as JSR 330.

Statistics

Views

Total Views
1,695
Views on SlideShare
1,512
Embed Views
183

Actions

Likes
1
Downloads
35
Comments
0

7 Embeds 183

http://www.codemotion.it 83
http://presentz.org 60
http://roma2012.codemotion.it 29
http://local.host 4
http://codemotion.loc 4
http://dev.presentz.org 2
http://www.docshut.com 1
More...

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Lawyer’s slideDon’t use any info for contracts or purchase decisionsDevelopment, release and timing at the discretion of Oracle
  • What’s coming?Duke dressed up with funky goggles and some sort of jet pack
  • To learn where we are going, we need to understand where we are
  • There was clear need for a Java API for RESTWhat is REST?Stateless communications: new requests don’t depend on old requests
  • POJO centric: no complicated or contrived contracts – just annotationsContainer independence: JAX-RS does not require servlets or any type of container
  • Use @Path to define web resourcesUse other annotations to map requests to methodsUse method return value as responseMBR and MBW help us behind the scenes
  • MBR and MBW can be user defined too
  • Don’t spend time describing these features, just read them quickly
  • There are 12 EG membersED submitted for publication to the PMO last Friday
  • What’s coming?Duke dressed up with funky goggles and some sort of jet pack
  • Don’t spend time describing these features, just read them quickly
  • Don’t spend time describing these features, just read them quickly
  • Don’t spend time describing these features, just read them quickly
  • Don’t spend time describing these features, just read them quickly
  • Don’t spend time describing these features, just read them quickly
  • Don’t spend time describing these features, just read them quickly
  • A structural link is used to avoid sending a complete representation of a resource. Clients can follow these type of links to retrieve the "pieces" they need. A transitional link is used to update the state of a resource and is typically identified by a "rel" attribute. Structural links are normally in the entity; transitional links could be in link headers or the entity.
  • Don’t spend time describing these features, just read them quickly
  • A high-level API isn't actually required, but some people prefer a proxy-based solution to writing clients. We do not have any plans to support one at this point.

JAX-RS 2.0: RESTful Java on Steroids, by Aron Gupta Presentation Transcript

  • 1. JAX-RS 2.0: RESTful Java on SteroidsArun Gupta, Java EE & GlassFish Guyhttp://blogs.oracle.com/arungupta, @arungupta 1 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 2. The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.2 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 3. Part I: How we got here ?3 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 4. How We Got Here? • Shortest intro to JAX-RS 1.0 • Requested features for JAX-RS 2.0 • JSR 339: JAX-RS 2.04 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 5. JAX-RS Origins • JAX-RS 1.0 is Java API for RESTful WS • RESTFul Principles: – Assign everything an ID – Link things together – Use common set of methods – Allow multiple representations – Stateless communications5 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 6. JAX-RS 1.0 Goals • POJO-Based API • HTTP Centric • Format Independence • Container Independence • Inclusion in Java EE6 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 7. Example: JAX-RS API Resources@Path("/atm/{cardId}") URI Parameterpublic class AtmService { Injection @GET @Path("/balance") @Produces("text/plain") public String balance(@PathParam("cardId") String card, @QueryParam("pin") String pin) { return Double.toString(getBalance(card, pin)); } … HTTP Method Built-in Binding Serialization 7 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 8. Example: JAX-RS API (contd.) … Custom Serialization @POST @Path("/withdrawal") @Consumes("text/plain") @Produces("application/json") public Money withdraw(@PathParam("card") String card, @QueryParam("pin") String pin, String amount){ return getMoney(card, pin, amount); }}8 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 9. Requested Features Filters/Handlers Client API Hypermedia Async JSR 330 Validation Improved Conneg MVC9 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 10. JSR 339 Expert Group • EG Formed in March 2011 • Oracle Leads: Marek Potociar / Santiago Pericas-G. • Expert Group: – Jan Algermissen, Florent Benoit, Sergey Beryozkin (Talend), Adam Bien, Bill Burke (RedHat), Clinton Combs, Bill De Hora, Markus Karg, Sastry Malladi (Ebay), Julian Reschke, Guilherme Silveira, Dionysios Synodinos • Early Draft 2 published on Feb 9, 2012!10 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 11. Part II: Where We Are Going11 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 12. New in JAX-RS 2.0 ✔ ✔ Filters/Handlers Client API ✔ Hypermedia ✔ ✔ Async JSR 330 ✔ Validation Improved ✔ ✗ Conneg MVC12 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 13. New in JAX-RS 2.0 ✔ Interceptors Client API /Handlers Hypermedia Async JSR 330 Validation Improved Conneg13 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 14. Motivation • HTTP client libraries too low level • Sharing features with JAX-RS server API • E.g., MBRs and MBWs • Supported by some JAX-RS 1.0 implementations • Need for a standard14 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 15. Example: Client API// Get instance of ClientClient client = ClientFactory.newClient();Can also inject @URI for the target // Get account balanceString bal = client.target("http://.../atm/balance") .pathParam("card", "111122223333") .queryParam("pin", "9876") .request("text/plain").get(String.class);16 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 16. Example: Client API (contd.)// Withdraw some moneyMoney mon = client.target("http://.../atm/withdraw") .pathParam("card", "111122223333") .queryParam("pin", "9876") .request("application/json") .post(text("50.0"), Money.class);17 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 17. Example: Generic Interface (Command pattern, Batch processing)Invocation inv1 = client.target("http://.../atm/balance")… .request(“text/plain”).buildGet();Invocation inv2 = client.target("http://.../atm/withdraw")… .request("application/json") .buildPost(text("50.0"));18 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 18. Example: Generic Interface (contd.)Collection<Invocation> invs = Arrays.asList(inv1, inv2);Collection<Response> ress = Collections.transform(invs, new F<Invocation, Response>() { public Response apply(Invocation inv) { return inv.invoke(); } });19 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 19. New in JAX-RS 2.0 ✔ ✔ Interceptors Client API /Handlers Hypermedia Async JSR 330 Validation Improved Conneg21 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 20. Motivation • Customize JAX-RS implementations via well-defined extension points • Use Cases: Logging, Compression, Security, Etc. • Shared by client and server APIs • Supported by most JAX-RS 1.0 implementations • All using slightly different types or semantics22 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 21. Filters • Non-wrapping extension points • Pre: Interface RequestFilter • Post: Interface ResponseFilter • Part of a filter chain • Do not call the next filter directly • Each filter decides to proceed or break chain • By returning FilterAction.NEXT or FilterAction.STOP23 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 22. Filter Example: LoggingFilter@Providerclass LoggingFilter implements RequestFilter, ResponseFilter { @Override public FilterAction preFilter(FilterContext ctx) throws IOException { logRequest(ctx.getRequest()); return FilterAction.NEXT; } … 24 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 23. Filter Example: LoggingFilter (contd.) @Override public FilterAction postFilter(FilterContext ctx) throws IOException { logResponse(ctx.getResponse()); return FilterAction.NEXT; }} 25 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 24. Interceptors • Wrapping extension points • ReadFrom: Interface ReaderInterceptor • WriteTo: Interface WriterInterceptor • Part of a interceptor chain • Call the next handler directly • Each handler decides to proceed or break chain • By calling ctx.proceed()26 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 25. Handler Example: GzipInterceptor@Providerclass GzipInterceptor implements ReaderInterceptor,WriterInterceptor { @Override public Object aroundreadFrom(ReadInterceptorContext ctx) throws IOException { if (gzipEncoded(ctx)) { InputStream old = ctx.getInputStream(); ctx.setInputStream(new GZIPInputStream(old)); } return ctx.proceed(); }… } 27 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 26. Order of execution Request WriteTo Request ReadFrom Filter Handler Filter Handler ReadFrom Response WriteTo Response Handler Filter Handler Filter Client Server28 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 27. Binding Example: LoggingFilter @NameBinding // or @Qualifier ? @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(value = RetentionPolicy.RUNTIME) public @interface Logged { } @Provider @Logged public class LoggingFilter implements RequestFilter, ResponseFilter { … }30 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 28. Binding Example: LoggingFilter @Path("/") public class MyResourceClass { @Logged @GET @Produces("text/plain") @Path("{name}") public String hello(@PathParam("name") String name) { return "Hello " + name; } }31 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 29. New in JAX-RS 2.0 ✔ ✔ Filters/Handlers Client API Hypermedia ✔ Async JSR 330 ✔ Validation Improved Conneg32 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 30. Motivation • Services must validate data • Bean Validation already provides the mechanism • Integration into JAX-RS • Support for constraint annotations in: • Fields and properties • Parameters (including request entity) • Methods (response entities) • Resource classes33 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 31. Example: Constraint Annotations @Path("/") class MyResourceClass { @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED)Built-in public void registerUser( @NotNull @FormParam("firstName") String fn, @NotNull @FormParam("lastName") String ln,Custom @Email @FormParam("email") String em) { ... } } 34 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 32. Example: User defined Constraints @Target({ METHOD, FIELD, PARAMETER }) @Retention(RUNTIME) @Constraint(validatedBy = EmailValidator.class) public @interface Email { ... } class EmailValidator implements ConstraintValidator<Email, String> { public void initialize(Email email) { … } public boolean isValid(String value, ConstraintValidatorContext context) { // Check value is e-mail address … } }35 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 33. Example: Request Entity Validation@CheckUser1class User { ... }@Path("/")class MyResourceClass { @POST @Consumes("application/xml") public void registerUser1(@Valid User u) { … } @POST @Consumes("application/json") public void registerUser12(@CheckUser2 @Valid User u) {… }} 36 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 34. New in JAX-RS 2.0 ✔ ✔ Filters/Handlers Client API Hypermedia ✔ ✔ Async JSR 330 ✔ Validation Improved Conneg37 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 35. Motivation • Let “borrowed” threads run free! • Container environment • Suspend and resume connections • Suspend while waiting for an event • Resume when event arrives • Leverage Servlet 3.X async support (if available) • Client API support • Future<RESPONSE>, InvocationCallback<RESPONSE>38 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 36. Example: Suspend and Resume @Path("/async/longRunning") public class MyResource { @Context private ExecutionContext ctx; @GET @Produces("text/plain") public void longRunningOp() { Executors.newSingleThreadExecutor().submit( new Runnable() { public void run() { Thread.sleep(10000); // Sleep 10 secs ctx.resume("Hello async world!"); } }); ctx.suspend(); // Suspend connection and return } … }39 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 37. Example: @Suspend Annotation @Path("/async/longRunning") public class MyResource { @Context private ExecutionContext ctx; @GET @Produces("text/plain") @Suspend public void longRunning() { Executors.newSingleThreadExecutor().submit( new Runnable() { public void run() { Thread.sleep(10000); // Sleep 10 secs ctx.resume("Hello async world!"); } }); // ctx.suspend(); Suspend connection and return } … }40 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 38. Example: Client API Async Support // Build target URI Target target = client.target("http://.../atm/balance")… // Start async call and register callback Future<?> handle = target.request().async().get( new InvocationCallback<String>() { public void complete(String balance) { … } public void failed(InvocationException e) { … } }); // After waiting for a while … If (!handle.isDone()) handle.cancel(true);41 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 39. New in JAX-RS 2.0 ✔ ✔ Filters/Handlers Client API ✔ Hypermedia ✔ ✔ Async JSR 330 ✔ Validation Improved Conneg42 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 40. Motivation • REST principles • Identifiers and Links • HATEOAS (Hypermedia As The Engine Of App State) • Link types: • Structural Links • Transitional Links43 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 41. Example: Structural vs. Transitional Links Link: <http://.../orders/1/ship>; rel=ship, <http://.../orders/1/cancel>; rel=cancel Transitional ... <order id="1"> <customer>http://.../customers/11</customer> <address>http://.../customers/11/address/1</customer> <items> <item> Structural <product>http://.../products/111</products> <quantity>2</quantity> </item> ... </order>44 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 42. Example: Using Transitional Links// Server APIResponse res = Response.ok(order) .link("http://.../orders/1/ship", "ship") .build();// Client APIResponse order = client.target(…) .request("application/xml").get();if (order.getLink(“ship”) != null) { Response shippedOrder = client .target(order.getLink("ship")) .request("application/xml").post(null); … }46 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 43. New in JAX-RS 2.0 ✔ ✔ Filters/Handlers Client API ✔ Hypermedia ✔ ✔ Async JSR 330 ✔ Validation ✔ Improved Conneg47 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 44. Improved Conneg GET http://.../widgets2 Accept: text/*; q=1 … Path("widgets2") public class WidgetsResource2 { @GET @Produces("text/plain", "text/html") public Widgets getWidget() {...} }48 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 45. Improved Conneg (contd.) GET http://.../widgets2 Accept: text/*; q=1 … Path("widgets2") public class WidgetsResource2 { @GET @Produces("text/plain;qs=0.5", "text/html;qs=0.75") public Widgets getWidget() {...} }49 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 46. Other Topics Under Consideration • Better integration with JSR 330 • Support @Inject and qualifiers • High-level client API?50 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 47. More Information • JSR: http://jcp.org/en/jsr/detail?id=339 • Java.net: http://java.net/projects/jax-rs-spec • User Alias: users@jax-rs-spec.java.net • All EG discussions forwarded to this list51 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.
  • 48. Q&A52 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.