5 Replies Latest reply on Jun 7, 2013 3:56 AM by Martin Kouba

    How to handle Conversation Exception in WELD 2.x?

    Wang Liyu Apprentice

      Hi,

      I'm trying to upgrade the WELD1.1.x dependencies to WELD 2.0.0, one thing I found is that in WELD 1.x, ConversationContext is bound with JSF lifecycle, in WELD2.0, ConversationContext is bound to Servlet (ServletRequestListener), in my project now I'm handling the conversation exceptions (None Exist Conversation or Busy Conversation Exception) with JSF Exception handler with no problem.

      I'm wondering how am I suppose to handle it with WELD2.0?

       

      ANy IDEAs?

       

      Thanks,

        • 1. Re: How to handle Conversation Exception in WELD 2.x?
          Martin Kouba Master

          Hi Wang,

           

          you can use a servlet filter to handle conversation-specific exceptions. Every CDI 1.1 container provides a special filter with the name "CDI Conversation Filter" - this can be mapped after your custom filter in web.xml (filters are invoked in the same order they're defined in the deployment descriptor):

           

          <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
            <filter>
              <filter-name>MyFilter</filter-name>
              <filter-class>com.whatever.MyFilter</filter-class>
            </filter>
            <filter-mapping>
              <filter-name>MyFilter</filter-name>
              <url-pattern>/*</url-pattern>
            </filter-mapping>
            <filter-mapping>
              <filter-name>CDI Conversation Filter</filter-name>
              <url-pattern>/*</url-pattern>
            </filter-mapping>
          </web-app>
          

           

          This mapping instructs the container to determine the conversation after your filter calls chain.doFilter() and  allows you to catch any exceptions thrown in the chain.

          • 2. Re: How to handle Conversation Exception in WELD 2.x?
            Wang Liyu Apprentice

            Thanks for replying so fast, in my case this is a little bit complicated, the project is using JSF 2.1 & Richfaces 4.x with CDI, in application, because CDI doesn't have "Restart Conversation" with one request/response, I have to do "Post-Redirect-Get" or "AJAXPost-Redirect-Get" to restart the session, in JSF ajax call force redirect is different than normal request, JSF lib will return a xml and the jsf.js will parse that and redirect, it was fine if I use JSF exception hanlder, If I use the method you suggested, the JSF AJAX Post - Redirect - Get won't work, any idea how to solve that?

            Also in the @BeforeDestruct on Conversation/Session beans if I call any JSF api (for example adding some Faces messages) with CDI 1.0 it's fine, with CDI 1.1 it will throw out exception because the destroy is in the filter instead of JSF lifecycle.

             

            Please help.

            • 3. Re: How to handle Conversation Exception in WELD 2.x?
              Martin Kouba Master

              Could you describe the "AJAXPost-Redirect-Get" more thorougly? And what exactly does not work?

               

              Re @PreDestroy - you're right, conversation scoped beans are now destroyed at the end of the servlet request, after the Faces servlet returns. Session scoped beans were always destroyed at the end of the request. I'm not sure it's a good idea to call JSF API inside @PreDestroy callback. What's your use case?

              • 4. Re: How to handle Conversation Exception in WELD 2.x?
                Wang Liyu Apprentice

                For example, in the faces-config.xml I have navigation rule:

                 

                  <navigation-case>

                                              <from-outcome>endConversation</from-outcome>

                                              <to-view-id>/home.xhtml</to-view-id>

                                              <redirect include-view-params="false" />

                                    </navigation-case>

                 

                then the JSF action return "endConversation", it will redirect, if the JSF action is called with <a4j:jsFunction> or <a4j:commandButton>, it actually fired a AJAX call and the JSF response instead 302 http code, it will be something like:

                 

                <?xml version='1.0' encoding='UTF-8'?>

                <partial-response><redirect url="/home.jsf></redirect></partial-response>

                 

                and on the page the jsf.js will fire a GET request to the server GET /home.jsf...

                 

                Same thing if Conversation is not exist (WELD-0321) or pre-exist (WELD-0218), I'll use this method to redirect to /home.jsf or /home.jsf?cid=...

                but with WELD2, I don't know how to do this.

                 

                And I saw the WELD2 boundled sample didn't have the beans.xml & web.xml updated, is there any way I can get a sample beans.xml & web.xml with all options in there?

                • 5. Re: How to handle Conversation Exception in WELD 2.x?
                  Martin Kouba Master

                  Hm, I think I finally see the reason why the "ajax way" doesn't work. I'm afraid you'll have to handle the ajax response and redirect manually, see for example http://stackoverflow.com/a/7880970.

                   

                  I still don't understand why to call JSF API in the @PreDestroy callback?