There has been some discussion lately regarding integrating JBoss Seam with RESTEasy. Jay Balunas recently made about post on his thoughts on ths subject, so I thought I’d post some of mine. For the record, I am a huge fan of Seam and I think there’s definitely a place for Seam in RESTEasy, so here’s a few of my musing on the subject:
Seam Managed Persistence Contexts
This is a really great feature of Seam and it adds a lot of value to a framework like RESTEasy. If you have a resource that returns a entity that is a complex object graph that will be marshalled to XML, you have a high potential for hitting a LazyInitialzationException. This is especially true if you’re calling a SLSB to get your data because the marshalling process is handled on the web tier, outside of the EJB transaction. If the entity was not fully initialized, your object graph will be incomplete and you will get a LazyInitialzationException. In the initial version of RESTEasy, I used a Seam managed persistence context in order successfully marshall a complex entity using JAXB without getting a LazyInitializationException. I could have written a filter that was similar to the Spring OpenSessionInViewFilter to span the transaction over the entire HTTP request, but Seam made this problem transparently go away in very elegant manner.
Transactions/Conversations
Conversations are one feature of Seam that cause a lot of folks to raise concerns about the stateful nature of the framework in regards to REST. However, I think in some instances, some of the conversational aspects of Seam can be utilized in a RESTful design. Take this thread on the JSR-311 mailing list from Bill regarding Transactions in JAX-RS:
No, I don’t want JAX-RS to have a transaction model 🙂
One pattern I’ve seen in REST is how they solve distributed
transactions. The pattern seems to be
/transactions/{tx-id}/.../whatever/your/real/resources/are
So really the transaction resource is allowed to contain any resource
the server supports. (I hope you are following me, if not I’ll expand).
IMHO, this is something I think Seam could lend a hand with. Taking both Seam’s support for conversations and jBPM, you could conceivably use a long-running conversation to implement such a feature whereby you might end up with something like:
/transactions/{conversation-id}/.../whatever/your/real/resources/are
It’s not a fully baked idea, nor might it be quite the same thing that Bill is talking about. However, it could potentially be RESTful if implemented properly and Seam already provides the plumbing for this out of the box.
Entity Resources
The Seam framework (as in org.jboss.seam.framework), offers a lot of convenience features that make working with JPA and Hibernate a breeze. I had a silly idea a while a back about how to expose entity beans as a resource without the need for a dedicated resource class. The idea wasn’t fully baked (and in hind sight, those details are actually kinda crappy and overly verbose), but the general idea was to make it easy to navigate elements of an object graph. For example, if you were to access the following URI:
http://myhost/contacts/12345
You’d end up with the full object graph as XML for contact ID 12345. If you just wanted to look at one address for that contact, you should be able to call:
http://myhost/contacts/12345/addresses/home
And you would get just the XML element for the contact’s “home” address. What I don’t want to do is create a separate resource class for each element and each collection type in the object graph. You shouldn’t have to create a ContactsResource, ContactResource, AddressesResource, AddressResource, etc. Ideally, you should be able to have one class, or just the entity itself, that can represent the resource. I’m currently working to refine this idea for RESTEasy and much of the Seam framework API could be useful in making this a reality.
I could go on, but I think there’s a lot of value that Seam can bring to RESTEasy.
How about an article on Struts 2 by the myth, the legend, Ryan McDonough 😉
-Mark
http://markjgreene.wordpress.com
LikeLike
How about an article on Struts 2 by the myth, the legend, Ryan McDonough 😉
-Mark
http://markjgreene.wordpress.com
LikeLike
This was exactly the type of discussion I was hoping would come out of my original post!!
I do think there are hurdles such as handling Seam injection, and seam component life cycle on a restful requests. Obviously some type of filter would be needed, but how much of that fits in seam vs RESTeasy requires more baking.
I think your points around accessing an entity object graph as a single resource is very important. When I was looking at RESTeasy one of my concerns was service class explosion.
LikeLike
This was exactly the type of discussion I was hoping would come out of my original post!!
I do think there are hurdles such as handling Seam injection, and seam component life cycle on a restful requests. Obviously some type of filter would be needed, but how much of that fits in seam vs RESTeasy requires more baking.
I think your points around accessing an entity object graph as a single resource is very important. When I was looking at RESTeasy one of my concerns was service class explosion.
LikeLike