I agree that Conversations should be supported for other connections besides JSF, however, with REST or any web service call there is a problem about tying a request to a session, you'd either have to have the client's support sending cookies in their requests or create store like a session yourself. If you go with the latter approach then it should be fairly easy to (well, as easy as creating passivation capable scopes is) to create a scope that would work with this cache / store.<div>
<br></div><div>If it is a regression, please create a JIRA with attached Arquillian test(s).<br><br><div class="gmail_quote">On Mon, Jan 16, 2012 at 16:03, Ove Ranheim <span dir="ltr"><<a href="mailto:oranheim@gmail.com">oranheim@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">The below test case impl doesn't track any sessions and the conversation only survives per method call. So the lifecycle to it isn't proper :) It's nothing more than a workaround.<div>
<br></div><div>It'd be better to have support for ConversationScope in Seam REST. Maybe I'm doing something wrong here, but my code case is as simple as:</div><div><br></div><div>1) PU produces a ConversationScoped entity manager in Seam Persistence</div>
<div><br></div><div>2) The REST service makes a call to a Stateful ConversationScoped bean, in which invokes the ConversationScoped PU</div><div><br></div><div>3) REST service beans are used to accommodate natural REST crud on top of a JSF page.</div>
<div><br></div><div>That's all there are to it. The deployment includes solder, faces, international, persistence, transaction, security, conversation-{weld and spi} and rest. I'm investigating ways to make a hybrid model that uses JSF and REST. So far so good, except for the aforementioned.</div>
<div><div class="h5"><div><br><div><div><div>On Jan 16, 2012, at 11:50 PM, Jason Porter wrote:</div><br><blockquote type="cite">Since you're using REST, how are you tracking the session? If don't have some way of doing that you'll end up possibly creating a new session / conversation with each request because it isn't tied to the same session.<br>
<br><div class="gmail_quote">On Mon, Jan 16, 2012 at 15:35, Ove Ranheim <span dir="ltr"><<a href="mailto:oranheim@gmail.com" target="_blank">oranheim@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">Jason,<div><br></div><div>Thanks for your feedback and maybe this is a regression. I made an interceptor to make my test code work, but I'm not sure what implication it'll have in a production environment.</div>
<div><br></div><div>Ove</div><div><br></div><div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(119,119,119)">@InterceptorBinding</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(22,47,202)"><span style="color:#777777">@Target</span><span style="color:#000000">({ </span>TYPE<span style="color:#000000">, </span>METHOD<span style="color:#000000"> })</span></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"><span style="color:#777777">@Retention</span>(RetentionPolicy.<span style="color:#162fca">RUNTIME</span>)</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(119,119,119)"><span style="color:#7e2b68">public</span><span style="color:#000000"> </span><span style="color:#7e2b68">@interface</span><span style="color:#000000"> </span>ConversationAware<span style="color:#000000"> {</span></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">}</div></div><div><br></div><div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(119,119,119)">
@ConversationAware<span style="color:#000000"> </span></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(119,119,119)">@Interceptor</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"><span style="color:#7e2b68">public</span> <span style="color:#7e2b68">class</span> ConversationHandler <span style="color:#7e2b68">implements</span> Serializable {</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
<span style="color:#7e2b68">private</span> <span style="color:#7e2b68">static</span> <span style="color:#7e2b68">final</span> <span style="color:#7e2b68">long</span> <span style="color:#162fca">serialVersionUID</span> = -6414852756277060457L;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"> <br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
<span style="color:#7e2b68">private</span> BoundConversationContext <span style="color:#162fca">ctx</span>;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#7e2b68">private</span> BoundRequest <span style="color:#162fca">request</span>;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"> <br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
<span style="color:#7e2b68">private</span> <span style="color:#7e2b68">void</span> createBoundConversationRequest() {</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#162fca">request</span> = <span style="color:#7e2b68">new</span> MutableBoundRequest(<span style="color:#7e2b68">new</span> HashMap<String, Object>(), <span style="color:#7e2b68">new</span> HashMap<String, Object>());</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> }</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px">
<br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#7e2b68">private</span> <span style="color:#7e2b68">void</span> selectBoundConversationContext() {</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#162fca">ctx</span> = Container.instance().deploymentManager().instance().select(BoundConversationContext.<span style="color:#7e2b68">class</span>).get();</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#162fca">ctx</span>.associate(<span style="color:#162fca">request</span>);</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#162fca">ctx</span>.activate();</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
}</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
<span style="color:#7e2b68">private</span> <span style="color:#7e2b68">void</span> cleanupBoundConversation() {</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
<span style="color:#7e2b68">if</span> (<span style="color:#162fca">ctx</span> != <span style="color:#7e2b68">null</span> && <span style="color:#162fca">ctx</span>.isActive()) {</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
<span style="color:#162fca">ctx</span>.deactivate();</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#162fca">ctx</span>.dissociate(<span style="color:#162fca">request</span>);</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> }</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
} </div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;min-height:15px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(119,119,119)">
<span style="color:#000000"> </span>@AroundInvoke</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#7e2b68">public</span> Object handle(InvocationContext ctx) <span style="color:#7e2b68">throws</span> Exception {</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#7e2b68">if</span> (ctx.getMethod().isAnnotationPresent( <span style="color:#777777">ConversationAware</span>.<span style="color:#7e2b68">class</span> )) {</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> createBoundConversationRequest();</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
<span style="color:#7e2b68">try</span> {</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> selectBoundConversationContext();</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#7e2b68">return</span> ctx.proceed();</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
} <span style="color:#7e2b68">finally</span> {</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> cleanupBoundConversation();</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> }</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
}</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> <span style="color:#7e2b68">return</span> <span style="color:#7e2b68">null</span>;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> } </div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
}</div></div><div><br></div><div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(119,119,119)">@GET</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(57,63,253)">
<span style="color:#777777">@Path</span><span style="color:#000000">(</span>"/{id:[0-9][0-9]*}"<span style="color:#000000">)</span></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(22,47,202)">
<span style="color:#777777">@Produces</span><span style="color:#000000">(MediaType.</span>APPLICATION_JSON<span style="color:#000000">)</span></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco;color:rgb(119,119,119)">
@ConversationAware</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"><span style="color:#7e2b68">public</span> <span style="text-decoration:underline">Pojo</span> lookupPojoById(<span style="color:#777777">@PathParam</span>(<span style="color:#393ffd">"id"</span>) Long id) {</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco"> // do something</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font:normal normal normal 11px/normal Monaco">
} </div></div><div><div><div><br></div><div><br></div><div><div><div>On Jan 16, 2012, at 9:45 PM, Jason Porter wrote:</div><br><blockquote type="cite"><div bgcolor="#FFFFFF"><div>I'd have to go through the seam conversation code as it is not documented. But I don't think the interceptor will work as in REST there isn't really a session to tie the conversation to. <br>
<br>Sent from my iPhone</div><div><br>On Jan 16, 2012, at 13:35, Ove Ranheim <<a href="mailto:oranheim@gmail.com" target="_blank">oranheim@gmail.com</a>> wrote:<br><br></div><div></div><blockquote type="cite"><div>
I have configured <span style="font-family:Monaco;font-size:11px"><span style="color:#678e91">class</span></span><span style="font-family:Monaco;font-size:11px"><span style="color:#508e92">></span></span><span style="font-family:Monaco;font-size:11px">org.jboss.seam.faces.context.conversation.ConversationBoundaryInterceptor</span><span style="font-family:Monaco;font-size:11px"><span style="color:#508e92"></</span></span><span style="font-family:Monaco;font-size:11px"><span style="color:#678e91">class</span></span><span style="font-family:Monaco;font-size:11px"><span style="color:#508e92">></span></span> in WEB-INF/beans.xml and seam-faces is used. In fact I use both JSF and REST.<div>
<br></div><div>Anything else that needs to be wired up?</div><div><br></div><div><div><div>On Jan 16, 2012, at 9:14 PM, Jason Porter wrote:</div><br><blockquote type="cite"><div>If you're using Seam Conversation and starting the conversation it will work. Out of the box, conversations don't work outside JSF. <br>
<br>Sent from my iPhone<br><br>On Jan 16, 2012, at 13:04, Ove Ranheim <<a href="mailto:oranheim@gmail.com" target="_blank">oranheim@gmail.com</a>> wrote:<br><br><blockquote type="cite">Hi guys,<br></blockquote><blockquote type="cite">
<br></blockquote><blockquote type="cite">I'm getting a "WELD-001303 No active contexts for scope type javax.enterprise.context.ConversationScoped" when making a call to a REST service that invokes a ConversationScoped bean.<br>
</blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Did I miss a configuration setting, or isn't ConversationScoped supported?<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">
Ove<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">javax.ejb.EJBTransactionRolledbackException: WELD-001303 No active contexts for scope type javax.enterprise.context.ConversationScoped<br>
</blockquote><blockquote type="cite"> org.jboss.as.ejb3.tx.CMTTxInterceptor.handleInCallerTx(CMTTxInterceptor.java:133)<br></blockquote><blockquote type="cite"> org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:196)<br>
</blockquote><blockquote type="cite"> org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:286)<br></blockquote><blockquote type="cite"> org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:182)<br>
</blockquote><blockquote type="cite"> org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)<br></blockquote><blockquote type="cite"> org.jboss.as.ejb3.component.session.SessionInvocationContextInterceptor.processInvocation(SessionInvocationContextInterceptor.java:71)<br>
</blockquote><blockquote type="cite"> org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)<br></blockquote><blockquote type="cite"> org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)<br>
</blockquote><blockquote type="cite"> org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:146)<br></blockquote><blockquote type="cite"> org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)<br>
</blockquote><blockquote type="cite"> org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)<br></blockquote><blockquote type="cite"> org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:76)<br>
</blockquote><blockquote type="cite"> com.parts.apartment.management.ApartmentService$$$view2.listApartmentUnits(Unknown Source)<br></blockquote><blockquote type="cite"> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br>
</blockquote><blockquote type="cite"> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br></blockquote><blockquote type="cite"> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br>
</blockquote><blockquote type="cite"> java.lang.reflect.Method.invoke(Method.java:597)<br></blockquote><blockquote type="cite"> org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:305)<br>
</blockquote>
<blockquote type="cite"> org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)<br></blockquote><blockquote type="cite"> org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163)<br>
</blockquote><blockquote type="cite"> org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:299)<br></blockquote><blockquote type="cite"> org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:125)<br>
</blockquote><blockquote type="cite"> org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:62)<br></blockquote><blockquote type="cite"> org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:125)<br>
</blockquote><blockquote type="cite"> com.parts.apartment.management.ApartmentService$Proxy$_$$_Weld$Proxy$.listApartmentUnits(ApartmentService$Proxy$_$$_Weld$Proxy$.java)<br></blockquote><blockquote type="cite"> com.parts.apartment.management.ApartmentService$Proxy$_$$_WeldClientProxy.listApartmentUnits(ApartmentService$Proxy$_$$_WeldClientProxy.java)<br>
</blockquote><blockquote type="cite"> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br></blockquote><blockquote type="cite"> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br>
</blockquote><blockquote type="cite"> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br></blockquote><blockquote type="cite"> java.lang.reflect.Method.invoke(Method.java:597)<br>
</blockquote><blockquote type="cite"> org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140)<br></blockquote><blockquote type="cite"> org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:255)<br>
</blockquote><blockquote type="cite"> org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:220)<br></blockquote><blockquote type="cite"> org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:209)<br>
</blockquote><blockquote type="cite"> org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:519)<br></blockquote><blockquote type="cite"> org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:496)<br>
</blockquote><blockquote type="cite"> org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119)<br></blockquote><blockquote type="cite"> org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)<br>
</blockquote><blockquote type="cite"> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)<br></blockquote><blockquote type="cite"> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)<br>
</blockquote><blockquote type="cite"> javax.servlet.http.HttpServlet.service(HttpServlet.java:847)<br></blockquote><blockquote type="cite"> org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)<br>
</blockquote><blockquote type="cite"> org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65)<br></blockquote><blockquote type="cite"> org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74)<br>
</blockquote><blockquote type="cite"> com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">
<br></blockquote><blockquote type="cite">_______________________________________________<br></blockquote><blockquote type="cite">seam-dev mailing list<br></blockquote><blockquote type="cite"><a href="mailto:seam-dev@lists.jboss.org" target="_blank">seam-dev@lists.jboss.org</a><br>
</blockquote><blockquote type="cite"><a href="https://lists.jboss.org/mailman/listinfo/seam-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/seam-dev</a><br></blockquote></div></blockquote></div><br></div></div>
</blockquote></div></blockquote></div><br></div></div></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Jason Porter<br><a href="http://lightguard-jp.blogspot.com/" target="_blank">http://lightguard-jp.blogspot.com</a><br>
<a href="http://twitter.com/lightguardjp" target="_blank">http://twitter.com/lightguardjp</a><br><br>Software Engineer<br>Open Source Advocate<br>Author of Seam Catch - Next Generation Java Exception Handling<br><br>PGP key id: 926CCFF5<br>
PGP key available at: <a href="http://keyserver.net/" target="_blank">keyserver.net</a>, <a href="http://pgp.mit.edu/" target="_blank">pgp.mit.edu</a><br>
</blockquote></div><br></div></div></div></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Jason Porter<br><a href="http://lightguard-jp.blogspot.com" target="_blank">http://lightguard-jp.blogspot.com</a><br>
<a href="http://twitter.com/lightguardjp" target="_blank">http://twitter.com/lightguardjp</a><br><br>Software Engineer<br>Open Source Advocate<br>Author of Seam Catch - Next Generation Java Exception Handling<br><br>PGP key id: 926CCFF5<br>
PGP key available at: <a href="http://keyserver.net" target="_blank">keyserver.net</a>, <a href="http://pgp.mit.edu" target="_blank">pgp.mit.edu</a><br>
</div>