Transcript
Page 1: Gwt cdi jaxrs_hbraun

GWT, CDI & JAX-RS“A match made in heaven”

Heiko Braun <[email protected]>

Page 2: Gwt cdi jaxrs_hbraun

About me

• Heiko Braun

• Senior Software Engineer JBoss / Red Hat

• 4 years JBoss, 12 years industry

• Focus on SOA, BPM, GWT

• Contributor: JBossWS, jBPM, Riftsaw, Errai, SAM, Savarra

> http://jboss.org

Page 3: Gwt cdi jaxrs_hbraun

Topics

• GWT ecosystem

• Integrating with CDI

• When to use JAX-RPC

Page 4: Gwt cdi jaxrs_hbraun

GWT ecosystem

Page 5: Gwt cdi jaxrs_hbraun

GWT: Strong client side

• GWT SDK: Tools & API to build Ajax clients & frameworks

• Integration capabilities:- GWT RPC- XHR (Request Builder)

• Data formats: JSON, XML

• Rich set of widget libraries: - Mosaic, Smart GWT, etc

Page 6: Gwt cdi jaxrs_hbraun

GWT: Weak server side

• Service implementation choice:- rely on GWT RPC- or handle the low level protocol manually

• Existing domain & component model?- Adapters, DTO’s, parallel hierarchy, etc- TX, Security, etc

• A lot of boilerplate needs to be written

Page 7: Gwt cdi jaxrs_hbraun

Backend implementation options

Page 8: Gwt cdi jaxrs_hbraun

Java EE choices

• CDI: Context and dependency injection for the EE platform(http://jcp.org/en/jsr/summary?id=299)

• Java API for RESTful web services(http://jcp.org/en/jsr/detail?id=311)

• Both part of EE 6

Page 9: Gwt cdi jaxrs_hbraun

Relation to Errai

• CDI integration build on Errai(http://jboss.org/errai)

• Integration is actually an extension to Errai and vice versa

• Knowledge about Errai Message Bus helpful,but not mandatory

Page 10: Gwt cdi jaxrs_hbraun

GWT & CDI

Page 11: Gwt cdi jaxrs_hbraun

GWT & CDI goals

• Similar to GWT-RPC:

• re-use domain model

• transparent wire protocol (serialization)

• In addition to GWT-RPC:

• Bypass the servlet tier (merely transport)

• Deep integration with EE component model

• Richer programming model & reduction of boiler plate

Page 12: Gwt cdi jaxrs_hbraun

CDI Concepts

• Portable Extensions

• Integration point when container bootstraps

• Create beans, annotation processing, meta data modifications

• Scope & Lifecycle

• ApplicationScoped, RequestScoped, ConversationScoped

• Bean context & reference

• Lookup and instance (reference) creation

12

Page 13: Gwt cdi jaxrs_hbraun

GWT & CDI Samples

Page 14: Gwt cdi jaxrs_hbraun

Using Pub/Sub

• Most low level use cases(Errai Bus, Pub/Sub)

• Similar to MessageDriven Bean(actual maps to it)

• Service implementation fully managed by CDI container

• Message Bus instance injected

CDI Component

GWT Client

14

Page 15: Gwt cdi jaxrs_hbraun

Exposing RPC endpoints

• Exposes a typed interface

• Similar to EJB Session beans(maps to it)

• RPC style, type safe client API

CDI Component

Remote interface

GWT Client

15

Page 16: Gwt cdi jaxrs_hbraun

Working with CDI events

• Bi-directional event exchange

• Discriminate on:- Event Type- Qualifier Annotations

• Exposes high level CDI client API

• Integrate with default and custom CDI events

CDI Component

GWT Client

16

Page 17: Gwt cdi jaxrs_hbraun

When to integrate with CDI

• Benefits of Java EE 6 and GWT as an alternative view layer technology

• Concise Java component model

• Tool chain: GWT, EJB, CDI, JPA, JCA, JMS

17

Page 18: Gwt cdi jaxrs_hbraun

GWT & JAX-RPC

Page 19: Gwt cdi jaxrs_hbraun

GWT & JAX-RPC goals

• RESTful web services:- RESTful API: open to non-java clients- Intermediaries: proxies, gateways, firewalls- [...] (See other Jazoon talks on this topic)

• Expose low level protocol with a decent API

• Directly expose XML, HTML from other resources- BIRT reporting (mashup, iframe)- Use of XML documents

• Integrate with XHR (RequestBuilder)

• Reuse domain model (serialization)

Page 20: Gwt cdi jaxrs_hbraun

JAX-RPC Concepts@Path("/customerservice/")@Produces("application/xml")public class CustomerService {

@GET @Path("/customers/{id}") @Produces("application/json") public Customer getCustomer(@PathParam("id") String id) { ...... }

@PUT @Path("/customers/{id}") @Consumes("application/xml") public Response updateCustomer(@PathParam("id") Long id, Customer customer) { ...... }

@POST @Path("/customers") public Response addCustomer(Customer customer) { ...... }

@DELETE @Path("/customers/{id}/") public Response deleteCustomer(@PathParam("id") String id) { ...... }}

Page 21: Gwt cdi jaxrs_hbraun

GWT & JAX-RPC samples

Page 22: Gwt cdi jaxrs_hbraun

Request a JAX-RPC resource

GWT Client

Server Resource

Page 23: Gwt cdi jaxrs_hbraun

Conclusion

• CDI integration probably most reasonable choice for within EE 6 environments

• Integration & boilerplate missing: Errai [1] to the rescue

• JAX-RPC is more open, but very low level. Still better then writing your own servlet code

• Remember: You can mix and match JAX-RPC and CDI within the same components (at least on JBoss 6)

[1] http://anonsvn.jboss.org/repos/errai/projects/weld-integration/trunk/

Page 24: Gwt cdi jaxrs_hbraun

Q&A

> http://jboss.org/errai> http://errai-blog.blogspot.com/

Page 25: Gwt cdi jaxrs_hbraun

Appendix A: Errai Message Bus

Page 26: Gwt cdi jaxrs_hbraun

Errai Basics• Backbone to application

design

• Federated architecture

• Asynchronous & bi-directional

• Supports POJO serialization

• Common shared API

• Supports OpenHUB spec

• HTTP + NIO

Page 27: Gwt cdi jaxrs_hbraun

Errai API

Publisher

Subscriber


Top Related