tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David Jencks <david_jen...@yahoo.com>
Subject AsyncListeners and resource injection
Date Thu, 16 Sep 2010 04:58:40 GMT
I think this is how AsyncContextImpl creates async listeners (lines 228ff)

    @Override
    public <T extends AsyncListener> T createListener(Class<T> clazz)
            throws ServletException {
        T listener = null;
        try {
             listener = clazz.newInstance();
        } catch (InstantiationException e) {
            ServletException se = new ServletException(e);
            throw se;
        } catch (IllegalAccessException e) {
            ServletException se = new ServletException(e);
            throw se;
        }
        return listener;
    }
    


but the 3.0 spec section 15.5 page 179 says

Annotations must be supported on the following container managed classes that implement the
following interfaces and are declared in the web application deployment descriptor or using
the annotations defined in Section 8.1, “Annotations and pluggability” on page 8-61 or
added programmatically.

and includes AsyncListener in the table following.  

So shouldn't this be using the instance manager to create the instance so the resource injection
machinery can do its stuff?


Secondly, if you do try to register an AsyncListener with  the ServletContext so it can be
scanned for annotations, aside from not actually scanning it, it quickly gets to this code
(ApplicationContext lines 1262 ff)

    @Override
    public <T extends EventListener> void addListener(T t) {
        if (!context.getState().equals(LifecycleState.STARTING_PREP)) {
            throw new IllegalStateException(
                    sm.getString("applicationContext.addListener.ise",
                            getContextPath()));
        }

        // TODO SERVLET3
        // throw UnsupportedOperationException - if this context was passed to the
        // {@link ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)}
        // method of a {@link ServletContextListener} that was not declared
        // in web.xml, a web-fragment or annotated with {@link WebListener}.
        
        boolean match = false;
        if (t instanceof ServletContextAttributeListener ||
                t instanceof ServletRequestListener ||
                t instanceof ServletRequestAttributeListener ||
                t instanceof HttpSessionAttributeListener) {
            context.addApplicationEventListener(t);
            match = true;
        }
        
        if (t instanceof HttpSessionListener
                || (t instanceof ServletContextListener &&
                        newServletContextListenerAllowed)) {
            context.addApplicationLifecycleListener(t);
            match = true;
        }
        
        if (match) return;
        
        throw new IllegalArgumentException(sm.getString(
                "applicationContext.addListener.iae.wrongType",
                t.getClass().getName()));

    }


which doesn't accept AsyncListeners.  (of course it shouldn't do anything with them).

Thoughts?

thanks
david jencks


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message