On Sep 15, 2010, at 9:58 PM, David Jencks wrote:
> 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 then).
>
> Thoughts?
>
> thanks
> david jencks
>
BTW I opened bug 49937 with fixes that work for me for these problems.
david jencks
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]