[weld-issues] [JBoss JIRA] Issue Comment Edited: (WELD-983) Portable war: Weld deployment on JBoss AS 7 should not require to remove the WeldListener line from the web.xml

Geoffrey De Smet (JIRA) jira-events at lists.jboss.org
Tue Oct 4 05:41:26 EDT 2011


    [ https://issues.jboss.org/browse/WELD-983?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12632014#comment-12632014 ] 

Geoffrey De Smet edited comment on WELD-983 at 10/4/11 5:40 AM:
----------------------------------------------------------------

Here's a workaround I wrote following solution 1 and 2.
It works when weld-servlet.jar is excluded from the war on jboss 7 (which is very annoying to do). Note that SafeWeldListener is in my codebase (so not in weld-servlet.jar of course).

{code}
/**
 * Workaround for https://issues.jboss.org/browse/WELD-983
 */
public class SafeWeldListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {

    private Boolean onJBoss7 = null;
    private ServletContextListener servletContextListener;
    private HttpSessionListener httpSessionListener;
    private ServletRequestListener servletRequestListener;

    private void checkOnJBoss(String serverInfo) {
        onJBoss7 = serverInfo.startsWith("JBoss Web/7.");
        if (!onJBoss7) {
            // Note that weldListener is not a global variable to avoid a ClassNotFoundException on JBoss 7
            Listener weldListener = new Listener();
            servletContextListener = weldListener;
            httpSessionListener = weldListener;
            servletRequestListener = weldListener;
        }
    }

    public void contextInitialized(ServletContextEvent sce) {
        checkOnJBoss(sce.getServletContext().getServerInfo());
        if (onJBoss7) {
            return;
        }
        servletContextListener.contextInitialized(sce);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        if (onJBoss7) {
            return;
        }
        servletContextListener.contextDestroyed(sce);
    }

    public void sessionCreated(HttpSessionEvent se) {
        if (onJBoss7) {
            return;
        }
        httpSessionListener.sessionCreated(se);
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        if (onJBoss7) {
            return;
        }
        httpSessionListener.sessionDestroyed(event);
    }

    public void requestDestroyed(ServletRequestEvent event) {
        if (onJBoss7) {
            return;
        }
        servletRequestListener.requestDestroyed(event);
    }

    public void requestInitialized(ServletRequestEvent event) {
        if (onJBoss7) {
            return;
        }
        servletRequestListener.requestInitialized(event);
    }

}
{code}

      was (Author: ge0ffrey):
    Solution proposal 1 and 2 works if you do it correctly (notice the note):

{code}
/**
 * Workaround for https://issues.jboss.org/browse/WELD-983
 */
public class SafeWeldListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {

    private Boolean onJBoss7 = null;
    private ServletContextListener servletContextListener;
    private HttpSessionListener httpSessionListener;
    private ServletRequestListener servletRequestListener;

    private void checkOnJBoss(String serverInfo) {
        onJBoss7 = serverInfo.startsWith("JBoss Web/7.");
        if (!onJBoss7) {
            // Note that weldListener is not a global variable to avoid a ClassNotFoundException on JBoss 7
            Listener weldListener = new Listener();
            servletContextListener = weldListener;
            httpSessionListener = weldListener;
            servletRequestListener = weldListener;
        }
    }

    public void contextInitialized(ServletContextEvent sce) {
        checkOnJBoss(sce.getServletContext().getServerInfo());
        if (onJBoss7) {
            return;
        }
        servletContextListener.contextInitialized(sce);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        if (onJBoss7) {
            return;
        }
        servletContextListener.contextDestroyed(sce);
    }

    public void sessionCreated(HttpSessionEvent se) {
        if (onJBoss7) {
            return;
        }
        httpSessionListener.sessionCreated(se);
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        if (onJBoss7) {
            return;
        }
        httpSessionListener.sessionDestroyed(event);
    }

    public void requestDestroyed(ServletRequestEvent event) {
        if (onJBoss7) {
            return;
        }
        servletRequestListener.requestDestroyed(event);
    }

    public void requestInitialized(ServletRequestEvent event) {
        if (onJBoss7) {
            return;
        }
        servletRequestListener.requestInitialized(event);
    }

}
{code}
  
> Portable war: Weld deployment on JBoss AS 7 should not require to remove the WeldListener line from the web.xml
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: WELD-983
>                 URL: https://issues.jboss.org/browse/WELD-983
>             Project: Weld
>          Issue Type: Bug
>    Affects Versions: 1.1.2.Final
>            Reporter: Geoffrey De Smet
>            Priority: Critical
>
> When deploying on JBoss AS 7, the web.xml can't contain this:
> {code}
>   <listener>
>     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
>   </listener>
> {code}
> When deploying on any other app servers (JBoss AS 5.1 EAP, Tomcat 6, Jetty 6, ...) that code needs to be there.
> This makes for an unportable wars.
> Maven profiles cannot fix this in many cases:
> - You don't want to run your build 5 times to build 5 different wars. You run it once, build a generic war and use assembly descriptors to build 5 appserver specific wars from that.
> - When you're using GWT, you want run in GWT-hosted mode (which uses jetty 6) a lot. So the default web.xml needs to contain it.
> - When you're using arquillian-jboss7 (in maven and straight for your IDE), the default web.xml should not have it.
> - When you're deploying a generic war to nexus, the web.xml should contain it?

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the weld-issues mailing list