[cdi-dev] CDI.current() vs initialContext.lookup("java:comp/BeanManager") in modular application servers

Martin Kouba mkouba at redhat.com
Fri Apr 29 03:30:33 EDT 2016


Hi Arjan,

Just few notes here:

* A lot of users think that it's irrelevant what BeanManager instance 
they're working on. The truth is the spec does not define this, i.e. 
whether there are multiple BeanManager instances in application or 
single one. On the other hand, some BeanManager methods assume a 
specific context. See for example BeanManager.getBeans(Type, Annotation...):

"Return the set of beans which have the given required type and 
qualifiers and are available for injection _in the module
  or library containing the class into which the BeanManager was 
injected or the Java EE component from whose JNDI environment namespace 
the BeanManager was obtained_, according to the rules of typesafe 
resolution."

I believe this implies that a concrete BeanManager reference should 
never be used outside the "module" it was injected in. Otherwise, 
methods like getBeans() will not work correctly.

* CDI.current().getBeanManager() is IMHO underspecified. Javadoc 
mentions "the current context" but it's not clear what does it mean.

* In Weld, there is a BeanManager per bean archive, but as said above 
it's just an implementation detail.

* WRT you use case - it's even more complicated, because you're 
referencing a JSF implicit dependency, which is not a regular 
application bean archive, nor a Java EE module, nor does it contain 
beans.xml (only extensions). org.jboss.as.weld.WeldProvider returns the 
BeanManager for the "synthetic" bean archive created for the JSF 
"module" as you're probably calling CDI.current() from a class located 
in the JSF lib. JNDI lookup returns the BeanManager for the EAR (I have 
no idea how JNDI works here).

* Last but not least - EARs are problematic and always will be (see for 
example all the @ApplicationScoped and visibility discussions).

Martin

Dne 28.4.2016 v 14:15 arjan tijms napsal(a):
> Hi,
>
> I noticed a difference between using CDI.current()
> and initialContext.lookup("java:comp/BeanManager") when called from
> within a container jar (e.g. Mojarra) in a modular application server
> (e.g. JBoss/WildFly).
>
> With CDI.current() the bean manager I get when called from within
> Mojarra is:
>
> "Weld BeanManager for com.sun.jsf-impl:main.additionalClasses [bean
> count=44]"
>
>
> With initialContext.lookup("java:comp/BeanManager") it's:
>
> Weld BeanManager for example_app.ear/example_app.war/WEB-INF/classes
> [bean count=97]
>
> Where "example_app" is an EAR application that I used for testing.
>
> I wonder, is this difference intended and did I overlook something, or
> is it an unfortunate consequence of something? An additional problem is
> that not all (modular) application servers act the same here. E.g. in
> GlassFish/Payara I get the application bean manager in both cases.
>
> Kind regards,
> Arjan Tijms
>
>
>
>
>
>
>
> _______________________________________________
> cdi-dev mailing list
> cdi-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/cdi-dev
>
> Note that for all code provided on this list, the provider licenses the code under the Apache License, Version 2 (http://www.apache.org/licenses/LICENSE-2.0.html). For all other ideas provided on this list, the provider waives all patent and other intellectual property rights inherent in such information.
>

-- 
Martin Kouba
Software Engineer
Red Hat, Czech Republic


More information about the cdi-dev mailing list