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

Jozef Hartinger jharting at redhat.com
Fri Apr 10 02:59:40 EDT 2015


Looks like another bug in weld-servlet's default ResourceInjectionServices

On 04/10/2015 04:12 AM, Jan Bartel wrote:
> 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'
>
>



More information about the weld-dev mailing list