[weld-dev] @Resource annotation handling by Weld vs Servlet container

Jan Bartel janb at intalio.com
Thu Apr 9 22:12:58 EDT 2015


A little more info ... I also get an error for this snippet:


    private DataSource myDS;

    @Resource(mappedName="jdbc/mydatasource")
    public void setMyDatasource(DataSource ds)
    {
        myDS=ds;
    }



java.lang.IllegalArgumentException: No @Resource annotation found on
injection point [BackedAnnotatedParameter] Parameter 1 of
[BackedAnnotatedMethod] @Resource public
com.acme.test.AnnotationTest.setMyDatasource(DataSource)
    at org.jboss.weld.injection.spi.helpers.AbstractResourceServices.resolveResource(AbstractResourceServices.java:38)
    at org.jboss.weld.injection.spi.helpers.AbstractResourceServices$1.createResource(AbstractResourceServices.java:121)
    at org.jboss.weld.injection.AbstractResourceInjection.getResourceReference(AbstractResourceInjection.java:44)
    at org.jboss.weld.injection.AbstractResourceInjection.injectResourceReference(AbstractResourceInjection.java:53)
    at org.jboss.weld.util.Beans.injectEEFields(Beans.java:344)
    at org.jboss.weld.injection.producer.ResourceInjector$1.proceed(ResourceInjector.java:69)
    at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)
    at org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:72)
    at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:121)
    at org.jboss.weld.environment.servlet.inject.AbstractInjector.inject(AbstractInjector.java:55)
    at org.jboss.weld.environment.jetty.JettyWeldInjector.inject(JettyWeldInjector.java:15)
    at org.jboss.weld.environment.jetty.WeldDecorator.decorate(WeldDecorator.java:105)
    at org.eclipse.jetty.util.DecoratedObjectFactory.decorate(DecoratedObjectFactory.java:77)
    at org.eclipse.jetty.servlet.ServletContextHandler$Context.createServlet(ServletContextHandler.java:1279)
    at org.eclipse.jetty.servlet.ServletHolder.newInstance(ServletHolder.java:1183)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:585)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:396)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:870)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:344)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)


thanks,
Jan

On 10 April 2015 at 10:00, Jan Bartel <janb at intalio.com> wrote:
> Hi Weld developers,
>
> The Jetty project is looking at how we can do a tighter integration
> with Weld, also with a view to discussions in the Servlet Spec 4
> committee to alleviate the necessity for CDI implementations to
> maintain jetty-specific initialisation code.
>
> During investigations, I noticed that we seem to have a conflict in
> the handling of a few annotations for classes that are managed by the
> servlet container (ie servlets, filters, listeners etc):
>
> @Resource
> @PostConstruct
> @PreDestroy
>
> As Jetty puts a servlet/filter/listener into service, we introspect
> the class and find the above annotations and process them. It seems
> that Weld does too, as I see the following failure for this code
> snippet:
>
> public class TestListener implements ServletContextListener
> {
>     @Resource(mappedName="maxAmount")
>      private Double maxAmount;
> }
>
>
> javax.naming.NameNotFoundException; remaining name 'maxAmount'
>     at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:429)
>     at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:533)
>     at javax.naming.InitialContext.lookup(InitialContext.java:411)
>     at org.jboss.weld.injection.spi.helpers.AbstractResourceServices.resolveResource(AbstractResourceServices.java:48)
>     at org.jboss.weld.injection.spi.helpers.AbstractResourceServices$1.createResource(AbstractResourceServices.java:121)
>     at org.jboss.weld.injection.AbstractResourceInjection.getResourceReference(AbstractResourceInjection.java:44)
>     at org.jboss.weld.injection.AbstractResourceInjection.injectResourceReference(AbstractResourceInjection.java:53)
>     at org.jboss.weld.util.Beans.injectEEFields(Beans.java:344)
>     at org.jboss.weld.injection.producer.ResourceInjector$1.proceed(ResourceInjector.java:69)
>     at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)
>     at org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:72)
>     at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:121)
>     at org.jboss.weld.environment.servlet.inject.AbstractInjector.inject(AbstractInjector.java:55)
>     at org.jboss.weld.environment.jetty.JettyWeldInjector.inject(JettyWeldInjector.java:15)
>     at org.jboss.weld.environment.jetty.WeldDecorator.decorate(WeldDecorator.java:105)
>     at org.eclipse.jetty.util.DecoratedObjectFactory.decorate(DecoratedObjectFactory.java:77)
>     at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:335)
>     at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
>     at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
>     at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:743)
>     at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:257)
>     at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
>
>
> Googling around, it is not clear to me exactly which of the Common
> Annotations (JSR250) that Weld supports and I'd appreciate some input
> from the Weld devs in order for Jetty to work out how best to move
> forward with Weld integration.
>
> In particular, I'd appreciate some clear feedback on which of the
> following @Resource annotation usages will be handled by Weld:
>
> @Resource on a class
> @Resource on a field
> @Resource on a method
> @Resource annotations without an accompanying @Producer annotation
>
> Secondly, as can be seen from the stacktrace above, Weld is failing to
> find the matching JNDI entry for an @Resource annotation. This is
> because Weld appears not to be looking in "java:comp/env" namespace,
> although IIRC that is mandated by the JavaEE spec for EE managed
> classes (servlets/filters/listeners etc). So if Jetty delegates
> handling of some/all processing of @Resource, how do we ensure that
> Weld will be able to find the right JNDI entry?
>
> thanks for your time,
> Jan
> --
> Jan Bartel <janb at intalio.com>
> www.webtide.com
> 'Expert Jetty/CometD developer,production,operations advice'



-- 
Jan Bartel <janb at intalio.com>
www.webtide.com
'Expert Jetty/CometD developer,production,operations advice'


More information about the weld-dev mailing list