users@ejb-spec.java.net

[ejb-spec users] Re: Portable JNDI names comments

From: Samuel Santos <samaxes_at_gmail.com>
Date: Thu, 12 Apr 2012 06:00:45 +0100

Hi Marina,

Are you looking for a pluggable EJB container? Or just a very specific SPI
> that the EJB container needs to provide?
>
I'm looking for a SPI that the EJB container needs to provide. Maybe
something like what Carlo de Wolf suggested.

In your scenario, if the developer wants to use @EJB injection, won't
> marking the class as a ManagedBean solve the problem?
>
Yes, marking the class as a ManagedBean solves the problem as long as the
developer has a beans.xml file in its project. Which is not always the case.

Thank you.
Best,

--
Samuel Santos
http://www.samaxes.com/
On Mon, Apr 9, 2012 at 10:34 PM, Marina Vatkina
<marina.vatkina_at_oracle.com>wrote:
> Samuel,
>
> Are you looking for a pluggable EJB container? Or just a very specific SPI
> that the EJB container needs to provide?
>
> In your scenario, if the developer wants to use @EJB injection, won't
> marking the class as a ManagedBean solve the problem?
>
> thanks,
> -marina
>
> Samuel Santos wrote:
>
>> Hi Carlo,
>>
>> Yep, having something like that in the spec would definitively help.
>>
>> In my previous scenario, and considering the current spec, the only way I
>> can come up with looking for an EJB which is in the EJBJAR module from the
>> WAR (without asking the developer for the moduleName where to look for), is
>> to scan the entire classloader...
>>
>> Best,
>>
>> --
>> Samuel Santos
>> http://www.samaxes.com/
>>
>>
>> On Thu, Mar 22, 2012 at 3:23 PM, Carlo de Wolf <cdewolf_at_redhat.com<mailto:
>> cdewolf_at_redhat.com>> wrote:
>>
>>    I believe you are looking for a resolver which can lookup EJBs
>>    from within the callers context with just the @EJB information.
>>
>>    @Resource // or through java:comp/EJBResolver (maybe
>>    java:global/EJBResolver?)
>>    EJBResolver resolver;
>>
>>    EJBResolver {
>>    <V> V lookup(EJB ejb, Class<V> beanInterface) throws
>>    EJBNotFoundException;
>>
>>    <V> V lookup(Class<V> beanInterface, String beanName, String
>>    lookup, String mappedName, String name) throws EJBNotFoundException;
>>    }
>>
>>    Where ejb.beanInterface == beanInterface or null. (Can annotations
>>    have a generic?)
>>
>>    Carlo
>>
>>
>>    On 03/22/2012 02:38 AM, Samuel Santos wrote:
>>
>>        Hi Marina,
>>
>>        What I'm suggesting is not related with classpath issues at all.
>>
>>        Using the same archive structure as in one of my previous emails:
>>
>>            |-- EJBJAR
>>            |   |-- FooService.java
>>            |   `-- FooServiceBean.java
>>            `-- WAR
>>                |-- BarActionBean.java
>>                `-- WEB-INF
>>                    `-- web.xml
>>
>>        Nothing is stopping you to import FooService.java and
>>        FooServiceBean.javainto
>>        BarActionBean.java.
>>
>>        However if you are trying to inject an EJB in an object that
>>        is *not
>>        managed by the container* you need to implement something like an
>>        InjectionEnricher [1] or [2]:
>>        In that InjectionEnricher you need to lookup for the EJB to be
>>        able to do
>>        something like this:
>>
>>            class BarActionBean {
>>                @EJB
>>                FooService fooService;
>>            }
>>
>>        The issue here is that the InjectionEnricher will be running
>>        in the WAR,
>>        meaning that context.lookup("java:module/**Mo​duleName") [1]
>>        will always
>>
>>        return the name of the WAR module, causing the EJB not to be
>>        found.
>>        Yes, forcing the developer to specify the full JNDI name (i.e.
>>        @EJB(lookup
>>        = "java:global/EAR/EJBJAR/**FooSer
>>        viceBean!com.foo.bar.**FooServic​e")) will
>>        work and is supported by the InjectionEnricher, but is not as
>>        clean as it
>>        could be.
>>
>>        A different solution would be to include a properties file in
>>        the WAR (e.g.
>>        jndi.properties) and have the InjectionEnricher look for the
>>        EJBs in the
>>        modules specified in that file instead of using
>>        context.lookup("java:module/**Mo​duleName"):
>>
>>            jndi.lookup.modules=EJBJAR,FOO JAR,BARJAR,...
>>
>>        However, I believe it would be helpful having the spec
>>        defining a standard
>>        way to do this.
>>
>>        Is this completely inappropriate?
>>
>>        [1]
>>        https://github.com/samaxes/str**​ipes-injection-enricher/blob/
>>        master/src/main/java/com/**samax​es/stripes/enricher/**EJBInjecti
>>        onEnricher.java
>>        <https://github.com/samaxes/**stripes-injection-enricher/**
>> blob/master/src/main/java/com/**samaxes/stripes/enricher/**
>> EJBInjectionEnricher.java<https://github.com/samaxes/stripes-injection-enricher/blob/master/src/main/java/com/samaxes/stripes/enricher/EJBInjectionEnricher.java>
>> >
>>        [2]
>>        https://github.com/arquillian/**​arquillian-core/blob/master/**te
>>        stenrichers/ejb/src/main/java/**​org/jboss/arquillian/**testenric
>>        her/ejb/EJBInjectionEnricher. java
>>        <https://github.com/**arquillian/arquillian-core/**
>> blob/master/testenrichers/ejb/**src/main/java/org/jboss/**
>> arquillian/testenricher/ejb/**EJBInjectionEnricher.java<https://github.com/arquillian/arquillian-core/blob/master/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java>
>> >
>>
>>
>>
>>        Thanks and please excuse my insistence,
>>
>>        --
>>        Samuel Santos
>>        http://www.samaxes.com/
>>
>>
>>        On Wed, Mar 14, 2012 at 1:32 AM, Marina Vatkina
>>        <marina.vatkina_at_oracle.com
>>        <mailto:marina.vatkina_at_oracle.**com <marina.vatkina_at_oracle.com>
>> >>wro​te:
>>
>>            Hi Samuel,
>>
>>            Samuel Santos wrote:
>>
>>                Hi Marina,
>>
>>                Sorry for the late reply, I've been outside the
>>                country and I'm now
>>                getting back to old emails.
>>
>>                I can use @EJB injection using
>>                context.lookup("java:module/****​Mo​duleName")
>>
>>                to inject Session Beans from an EJB module in the same
>>                EAR directly in my
>>                WAR (please see my email from Feb 10 for more detail), if:
>>
>>                - An EJB client JAR in the lib folder of my WAR;
>>
>>            Of your EAR.
>>
>>             - Or by referencing the EJB module in the Class-Path
>>            attribute of the
>>
>>                manifest file in my WAR.
>>
>>            Yes.
>>
>>                Have I understood you correctly?
>>
>>                Best,
>>
>>                --
>>                Samuel Santos
>>                http://www.samaxes.com/
>>
>>
>>                On Wed, Feb 15, 2012 at 4:44 AM, Marina Vatkina<
>>                marina.vatkina_at_oracle.com
>>                <mailto:marina.vatkina_at_oracle.**com<marina.vatkina_at_oracle.com>><mail
>>
>>                to:marina.vatkina_at_oracle.
>>                <mailto:marina.vatkina_at_oracle.**>**​
>>                com<marina.vatkina_at_oracle.com
>>                <mailto:marina.vatkina_at_oracle.**com<marina.vatkina_at_oracle.com>
>> >>​>>
>>
>>                wrote:
>>
>>                   Aren't these the visibility rules in an EAR file
>>                defined by the
>>                   Java EE 6 spec EE.8.3.1 Web Container Class Loading
>>                Requirements?
>>
>>                   "Components in the web container may have access to
>>                the following
>>                   classes and resources. Portable applications must
>>                not depend on
>>                   having or not having access to these classes or
>>                resources.
>>                   •The classes and resources accessible to any
>>                other web modules
>>
>>                   included in the same ear file, as described above.
>>                   •The content of any EJB jar files included in the
>>                same ear file."
>>
>>
>>                   To do the @EJB injection the EJB interface needs to
>>                be placed into
>>                   a library or the EJB module needs to be referenced
>>                in the
>>                   Class-Path attribute of the manifest file in the
>>                WAR or another
>>                   EJB module.
>>
>>                   If the library solution doesn't work, I would
>>                consider it a bug.
>>                   Without a library, the lookup work around seems
>>                like something
>>                   that happens to work in a particular appserver.
>>
>>
>>                   Best,
>>                   -marina
>>
>>                   Samuel Santos wrote:
>>
>>                       Hi David,
>>
>>                       Yes, perform @EJB injection without having to
>>                specify the full
>>                       JNDI name (i.e. @EJB(lookup =
>>                "FULL_JNDI_NAME")) on objects
>>                       inside the container that are *not* managed by it.
>>                       That is why we need plugins like Stripes
>>                Injection Enricher
>>                       that I mentioned earlier.
>>
>>                       Best,
>>
>>                       --
>>                       Samuel Santos
>>                       http://www.samaxes.com/
>>
>>
>>                       On Wed, Feb 15, 2012 at 12:32 AM, Reza Rahman
>>                       <reza_rahman_at_lycos.com
>>                <mailto:reza_rahman_at_lycos.com>**<
>>                mailto:reza_rahman_at_lycos.com
>>                <mailto:reza_rahman_at_lycos.com>**>
>>                       <mailto:reza_rahman_at_lycos.com
>>                <mailto:reza_rahman_at_lycos.com>**
>>                <mailto:reza_rahman_at_lycos.com
>>                <mailto:reza_rahman_at_lycos.com>**>​**​>>
>>
>>
>>                       wrote:
>>
>>                          You can use CDI to do this.
>>
>>
>>                          On 2/14/2012 7:29 PM, David Blevins wrote:
>>
>>                              Hi Samuel,
>>
>>                              To make sure I'm understanding
>>                correctly, it looks like
>>                       what
>>                              you really want is to perform @EJB
>>                injection on objects
>>                              running inside the container.  Is that
>>                more or less the
>>                              high-level goal?
>>
>>
>>                              -David
>>
>>                              On Feb 10, 2012, at 10:51 AM, Samuel
>>                Santos wrote:
>>
>>                                  Hi Marina,
>>
>>                                  Judging from your reply, my text was
>>                not clear enough.
>>                                  I apologize for that, English is not
>>                my first language.
>>                                  I will try to exemplify it using code.
>>
>>                                  Lets say that the project has the
>>                following structure:
>>
>>                                  EAR
>>                                  |-- EJBJAR
>>                                  |   |-- FooService.java
>>                                  |   `-- FooServiceBean.java
>>                                  `-- WAR
>>                                      |-- BarActionBean.java
>>                                      |-- WEB-INF
>>                                      |   `-- web.xml
>>
>>                                  Guessing JNDI names as we do in
>>                Stripes Injection
>>                       Enricher
>>                                  [1] or in JBoss Arquillian [2] will
>>                not allow us to
>>                       inject
>>                                  an EJB in BarActionBean.java like this:
>>                                  class BarActionBean {
>>                                      @EJB
>>                                      FooService fooService;
>>                                  }
>>
>>                                  We must always specify the lookup or
>>                mappedName
>>                       elements
>>                                  of the @EJB annotation:
>>                                  class BarActionBean {
>>                                      @EJB(lookup =
>>                                         "java:global/EAR/EJBJAR/**
>>                FooSe​rviceBean!com.foo.bar.**​**FooServi​ce")
>>                                      // or @EJB(lookup =
>>                                  "java:global/EAR/EJBJAR/****FooS
>>                er​viceBean")
>>                                      // or @EJB(lookup =
>>                                         "java:app/EJBJAR/**FooService
>>                 Be​an!com.foo.bar.*
>>                *FooService")
>>                                      // or @EJB(lookup =
>>                       "java:app/EJBJAR/**FooService​**Be​an")
>>
>>                                      FooService fooService;
>>                                  }
>>
>>                                  What I'm trying to suggest is to
>>                have a standard
>>                       allowing
>>                                  us to configure a project (in this
>>                example the WAR
>>                                  archive) to lookup for EJBs in
>>                external modules.
>>
>>                                  Either by defining them in the
>>                deployment descriptor:
>>                                  <jndi-lookup>
>>                                      <modules>
>>                                          <module>EJBJAR</module>
>>                                          <module>FOOJAR</module>
>>                                          <module>BARJAR</module>
>>                                          <module>...</module>
>>                                      </modules>
>>                                  </jndi-lookup>
>>
>>                                  Or in a properties file (e.g.
>>                jndi.properties):
>>                                  jndi.lookup.modules=EJBJAR,****F
>>                OO​JAR,BARJAR,...
>>
>>
>>                                  That way we can read those
>>                configurations and
>>                       lookup for
>>                                  the EJBs in that particular modules
>>                without
>>                       defining the
>>                                  entire JNDI name each time we need
>>                to inject an EJB.
>>
>>                                  [1]
>>                                         https://github.com/samaxes/**
>>                st​ripes-injection-enricher/**
>>                **blob/​master/src/main/**java​/com/**
>>                samax​es/stripes/enricher/****
>>                EJBInjecti​onEnricher.java<**h
>>                ttps://github.com/samaxes/stri**
>>                pes-injection-enricher/blob/
>>                master/src/main/java/com/**samax
>>                es/stripes/enricher/**EJBInjecti​onEnricher.java
>>                <https://github.com/samaxes/**stripes-injection-enricher/*
>> *blob/master/src/main/java/com/**samaxes/stripes/enricher/**
>> EJBInjectionEnricher.java<https://github.com/samaxes/stripes-injection-enricher/blob/master/src/main/java/com/samaxes/stripes/enricher/EJBInjectionEnricher.java>
>> >>
>>                                  [2]
>>                                         https://github.com/â
>>                <https://github.com/%C3%A2>€‹**arquill ian/**
>>                arquillian-core/​blob/**master
>>                /**testenrichers/ejb/​src/​**main/**
>>                java/org/jboss/​arquillian/***​*testenricher/ejb/**
>>                EJ​BInjectionEnricher.java<**h
>>                ttps://github.com/arquillian/a**
>>                rquillian-core/blob/master/**tes
>>                tenrichers/ejb/src/main/java/
>>                org/jboss/arquillian/**testenric
>>                her/ejb/EJBInjectionEnricher.​**java
>>                <https://github.com/**arquillian/arquillian-core/**
>> blob/master/testenrichers/ejb/**src/main/java/org/jboss/**
>> arquillian/testenricher/ejb/**EJBInjectionEnricher.java<https://github.com/arquillian/arquillian-core/blob/master/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java>
>> >>
>>
>>
>>
>>                                  Thank you and best regards,
>>
>>                                  --
>>                                  Samuel Santos
>>                                  http://www.samaxes.com/
>>
>>
>>                                  On Fri, Feb 10, 2012 at 2:37 AM, Marina
>>                                  Vatkina<marina.vatkina_at_oracle.**
>>                **​com<marina.vatkina_at_oracle**​.com
>>                <mailto:marina.vatkina_at_oracle.**com<marina.vatkina_at_oracle.com>
>> >>
>>                       <mailto:marina.vatkina@â
>>                <mailto:marina.vatkina@%C3%A2>**€‹ora
>>                cle.**com<marina.vatkina_at_oracl e.com
>>                <mailto:marina.vatkina_at_oracle.**com<marina.vatkina_at_oracle.com>
>> >>>
>>                                  <mailto:marina.vatkina_at_oracle.
>>                <mailto:marina.vatkina_at_oracle.**>
>>                **​com<marina.vatkina_at_oracle**​.com
>>                <mailto:marina.vatkina_at_oracle.**com<marina.vatkina_at_oracle.com>
>> >>
>>
>>                       <mailto:marina.vatkina@â
>>                <mailto:marina.vatkina@%C3%A2>**€‹ora
>>                cle.**com<marina.vatkina_at_oracl e.com
>>                <mailto:marina.vatkina_at_oracle.**com<marina.vatkina_at_oracle.com>
>> >>>>>
>>
>>                 wrote:
>>
>>                                  Samuel,
>>
>>                                  EJB spec (see 4.4.1.1java:app and
>>                       4.4.1.2java:module) is
>>                                  clear that you should use
>>                "java:app/ModuleName" to
>>                       access
>>                                  beans in other modules in your EAR
>>                file and
>>                                  "java:module/BeanName" to access
>>                beans in the same
>>                       EJB module.
>>
>>                                  Best,
>>                                  -marina
>>
>>
>>                                  Samuel Santos wrote:
>>                                  Hi all,
>>
>>                                  I find the Global JNDI Namespace,
>>                and finally having
>>                                  portable names across different
>>                containers, a
>>                       really neat
>>                                  feature.
>>                                  However, it still is not easy to
>>                inject EJB from
>>                       different
>>                                  modules inside an EAR archive.
>>
>>                                  I'm working on a small open source
>>                project [1] to
>>                       support
>>                                  @EJB, @Inject and @Resource standard
>>                Java EE
>>                       annotations
>>                                  on Stripes Framework [2] using
>>                portable JNDI names.
>>                                  As you can see by looking at the
>>                code [1], I'm using
>>                                  context.lookup("java:app/****App
>>                Na​me") and
>>                                  context.lookup("java:module/****
>>                Mo​duleName") to build
>>
>>                       the JNDI
>>                                  names to lookup.
>>
>>                                  Unfortunately it only works as long
>>                as you are
>>                       injecting
>>                                  EJBs inside the same module where it is.
>>                                  If you have an EAR with two modules,
>>                one WAR and
>>                       one EJB,
>>                                  and try to inject an EJB in a class
>>                inside the WAR, the
>>                                  code will not work.
>>                                  We have to define the full JNDI name
>>                in the
>>                       mappedName or
>>                                  lookup elements of the @EJB
>>                annotation every time
>>                       we are
>>                                  injecting a session bean in a class
>>                inside the WAR
>>                       archive.
>>
>>                                  I believe it is the role of the EJB
>>                spec to make
>>                       this easier.
>>                                  Can we define a way to configure
>>                projects to lookup for
>>                                  JNDI names in other modules (e.g. by
>>                       defining/enumerating
>>                                  them in web.xml or other deployment
>>                descriptor)?
>>
>>                                  [1]
>>                                         https://github.com/samaxes/**
>>                st​ripes-injection-enricher/**
>>                **blob/​master/src/main/**java​/com/**
>>                samax​es/stripes/enricher/****
>>                EJBInjecti​onEnricher.java<**h
>>                ttps://github.com/samaxes/stri**
>>                pes-injection-enricher/blob/
>>                master/src/main/java/com/**samax
>>                es/stripes/enricher/**EJBInjecti​onEnricher.java
>>                <https://github.com/samaxes/**stripes-injection-enricher/*
>> *blob/master/src/main/java/com/**samaxes/stripes/enricher/**
>> EJBInjectionEnricher.java<https://github.com/samaxes/stripes-injection-enricher/blob/master/src/main/java/com/samaxes/stripes/enricher/EJBInjectionEnricher.java>
>> >>
>>                                  [2] http://www.stripesframework.****
>>                or​g<http://www.stripesframe**​work.org
>>                <http://www.stripesframework.**org<http://www.stripesframework.org>
>> >>
>>
>>
>>                                  Thanks and best regards,
>>
>>                                  --
>>                                  Samuel Santos
>>                                  http://www.samaxes.com/
>>
>>
>>
>>                              -----
>>                              No virus found in this message.
>>                              Checked by AVG - www.avg.com
>>                <http://www.avg.com><http://**www.avg.com<http://www.avg.com>
>> ​>
>>                       <http://www.avg.com>
>>
>>                              Version: 2012.0.1913 / Virus Database:
>>                2112/4809 - Release
>>                              Date: 02/14/12
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>