Presentation is loading. Please wait.

Presentation is loading. Please wait.

Enterprise Java v1304261 JNDI Enterprise Naming Conext (ENC) and Injection JNDI ENC.

Similar presentations


Presentation on theme: "Enterprise Java v1304261 JNDI Enterprise Naming Conext (ENC) and Injection JNDI ENC."— Presentation transcript:

1 Enterprise Java v1304261 JNDI Enterprise Naming Conext (ENC) and Injection JNDI ENC

2 Enterprise Java v1304262 Goals Configure applications –Using the JNDI Enterprise Naming Context (ENC) –Using Context and Dependency Injection (CDI) Access remote EJBs JNDI ENC

3 Enterprise Java v1304263 Objectives JNDI ENC Overview JNDI ENC Lookup XML Population Annotation Population Dependency Injection Context and Dependency Injection (CDI) Population Remote JNDI Client JNDI ENC

4 Enterprise Java v1304264 JNDI ENC Overview Component's individual address space Holds references to values and objects in the environment Theoretical equivalent to Unix soft links –ln -s $HOME/ Object's registered –EJB interfaces (local and remote) –JMS connection factories –JMS destinations –data sources –any JCA resource –primitive values JNDI ENC

5 Enterprise Java v1304265 JNDI ENC and Injection Objects are placed in the component's JNDI ENC by the container Components may look these values up –using raw JNDI calls –using SessionContext convenience method –allows any nested component to also get the environment Components may have values injected into properties/fields. –fewer lines of code dedicated to lookups –inversion of control JNDI ENC

6 Enterprise Java v1304266 Reading JNDI ENC JNDI InitialContext jndi = new InitialContext(); object = jndi.lookup(“java:comp/env/encname); SessionContext SessionContext ctx;... object = ctx.lookup(“encname”); JNDI ENC

7 Enterprise Java v1304267 XML Population: Example POJO Style //@Local declared by ejb-jar.xml entry public interface HospitalLocal extends Scheduler {} //@Remote declared by ejb-jar.xml entry public interface HospitalRemote extends Scheduler {} //@Stateless(name=”Hospital”) declared by ejb-jar.xml entry public class HospitalEJB extends SchedulerBase implements HospitalLocal, HospitalRemote { public String getName() { return "HospitalEJB"; } @Resource public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } } //@Local declared by ejb-jar.xml entry public interface AidSchedulerLocal extends Scheduler {} //@Remote declared by ejb-jar.xml entry public interface AidSchedulerRemote extends Scheduler {} JNDI ENC

8 Enterprise Java v1304268 XML Population: Example POJO Style //@Stateless(name=”AidScheduler”) declared by ejb-jar.xml entry public class AidSchedulerEJB extends SchedulerBase implements AidSchedulerLocal, AidSchedulerRemote { private EntityManager em; private DataSource ds; private String message; private HospitalLocal hospital; @Resource //in super - protected SessionContext ctx; public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } public void init() { log.info("************* AidScheduler Created ************"); log.debug("ctx=" + ctx); log.debug("ejb/hospital=" + ctx.lookup("ejb/hospital")); log.debug("message=" + message); log.debug("em=" + em); log.debug("ds=" + ds); log.debug("hospital=" + hospital); } public String getName() { return "AidScheduler"; } } JNDI ENC

9 Enterprise Java v1304269 XML Population: Example Output ******************* AidScheduler Created ****************** ctx=org.jboss.as.ejb3.context.SessionContextImpl@178cae4 ejb/hospital=Proxy for view class: ejava.examples.jndidemo.ejb.HospitalLocal of EJB: Hospital message=Hello Helping World em=org.jboss.as.jpa.container.TransactionScopedEntityManager@77051f ds=org.jboss.jca.adapters.jdbc.WrapperDataSource@1839aa9 hospital=Proxy for view class: ejava.examples.jndidemo.ejb.HospitalLocal of EJB: Hospital listing env jndi: java:comp/env/ejb/hospital=Proxy for view class: ejava.examples.jndidemo.ejb.HospitalLocal of EJB: Hospital enc: ejb/hospital=Proxy for view class: ejava.examples.jndidemo.ejb.HospitalLocal of EJB: Hospital jndi: java:comp/env/persistence/jndidemo=org.jboss.as.jpa.container.TransactionScopedE ntityManager@10750d5 enc: persistence/jndidemo=org.jboss.as.jpa.container.TransactionScopedEntityManager@b 32027 java:comp/env=listing java:comp/env JNDI ENC

10 Enterprise Java v13042610 XML Population: META-INF/ejb-jar.xml <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">... Hospital ejava.examples.jndidemo.ejb.HospitalLocal ejava.examples.jndidemo.ejb.HospitalRemote ejava.examples.jndidemo.ejb.HospitalEJB JNDI ENC

11 Enterprise Java v13042611 XML Population: META-INF/ejb-jar.xml AidScheduler ejava.examples.jndidemo.ejb.AidSchedulerLocal ejava.examples.jndidemo.ejb.AidSchedulerRemote ejava.examples.jndidemo.ejb.AidSchedulerEJB Stateless init JNDI ENC

12 Enterprise Java v13042612 XML Population: env-entry vals/message java.lang.String Hello Helping World ejava.examples.jndischeduler.ejb.AidSchedulerEJB message JNDI ENC

13 Enterprise Java v13042613 XML Population: ejb-local-ref ejb/hospital Session ejava.examples.jndischeduler.ejb.HospitalLocal Hospital ejava.examples.jndischeduler.ejb.AidSchedulerEJB hospital JNDI ENC

14 Enterprise Java v13042614 XML Population: EntityManager persistence/jndidemo jndischeduler Transaction ejava.examples.jndischeduler.ejb.AidSchedulerEJB em JNDI ENC

15 Enterprise Java v13042615 XML Population: DataSource jdbc/myds javax.sql.DataSource Container ejava.examples.jndidemo.ejb.AidSchedulerEJB ds JNDI ENC

16 Enterprise Java v13042616 XML JNDI mapping META-INF/jboss- ejb3.xml <jboss:ejb-jar xmlns:jboss="urn:jboss:domain:ejb3:1.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:s="urn:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1" impl-version="2.0"> AidScheduler jdbc/myds java:jboss/datasources/ExampleDS JNDI ENC

17 Enterprise Java v13042617 Annotation Population: Example Entities @Local public interface CookLocal extends Scheduler {} @Stateless public class CookEJB extends SchedulerBase implements CookLocal { public String getName() { return "CookEJB"; } @Resource protected void setSessionContext(SessionContext ctx) { super.ctx = ctx; } @Remote public interface BakeSchedulerRemote extends Scheduler {} JNDI ENC

18 Enterprise Java v13042618 Annotation Population: Example Java Class @Stateful(name="BakeScheduler") @PersistenceContext(unitName="jndidemo", name="persistence/jndidemo", type=PersistenceContextType.EXTENDED) public class BakeSchedulerEJB extends SchedulerBase implements BakeSchedulerRemote { @PersistenceContext(unitName="jndidemo", type=PersistenceContextType.EXTENDED) private EntityManager em; @Resource(name="persistence/jndidemo") private EntityManager em2; @Resource(mappedName="java:jboss/datasources/ExampleDS") private DataSource ds; @Resource protected void setSessionContext(SessionContext ctx) { super.ctx = ctx; } JNDI ENC

19 Enterprise Java v13042619 Annotation Population: Example Java Class protected CookLocal cook; @EJB(name=“ejb/cook”) protect CookLocal cook2; @Resource(name="vals/message") String message; @PostConstruct public void init() { log.info("********* BakeScheduler Created ********"); log.debug("ctx=" + ctx); log.debug("em=" + em); log.debug("ds=" + ds); log.debug("persistence/jndidemo=" + ctx.lookup("persistence/jndidemo")); log.debug("message=" + message); log.debug("cook=" + cook); log.debug("cook=" + cook2); log.debug("ejb/cook=" + ctx.lookup("ejb/cook")); } JNDI ENC

20 Enterprise Java v13042620 Annotation Population: Example Output ******************* BakeScheduler Created ****************** ctx=org.jboss.as.ejb3.context.SessionContextImpl@18d9f9b em=ExtendedEntityManager [ jndiDemoEAR-3.0.2012.2-SNAPSHOT.ear/jndiDemoEJB.jar#jndidemo] em2=ExtendedEntityManager [ jndiDemoEAR-3.0.2012.2-SNAPSHOT.ear/jndiDemoEJB.jar#jndidemo] ds=org.jboss.jca.adapters.jdbc.WrapperDataSource@1839aa9 message=null cook=null cook2=Proxy for view class: ejava.examples.jndidemo.ejb.CookLocal of EJB: CookEJB ejb/cook=Proxy for view class: ejava.examples.jndidemo.ejb.CookLocal of EJB: CookEJB listing java:comp/env jndi: java:comp/env/ejb/cook=Proxy for view class: ejava.examples.jndidemo.ejb.CookLocal of EJB: CookEJB enc: ejb/cook=Proxy for view class: ejava.examples.jndidemo.ejb.CookLocal of EJB: CookEJB jndi: java:comp/env/persistence/jndidemo=ExtendedEntityManager [jndiDemoEAR- 3.0.2012.2-SNAPSHOT.ear/jndiDemoEJB.jar#jndidemo] enc: persistence/jndidemo=ExtendedEntityManager [jndiDemoEAR-3.0.2012.2- SNAPSHOT.ear/jndiDemoEJB.jar#jndidemo] java:comp/env=listing java:comp/env JNDI ENC

21 Enterprise Java v13042621 Dependency Injection fields –simple, less verbose property setter –easier to plug into unit tests –no need for getter –inheritance supported JNDI ENC

22 Enterprise Java Context and Dependency Injection (CDI): JSR-299 JSR-299 Started as “Web Beans” Derived from Seam Original Draft conflicted with Google+Spring submission –JSR-330 (Java Injection) Approved version refactored to account for JSR-330 v13042622JNDI ENC

23 Enterprise Java Sample CDI Related Types java.lang.annotation –@Retention – how long annotation is retained (default=CLASS) –RetentionPolicy CLASS – annotation recorded in class file but not available at runtime RUNTIME – annotation recorded in class and available at runtime SOURCE – annotation discarded by compiler –@Target – kind of Java construct annotation applies –ElementType TYPE FIELD METHOD PARAMETER (more) javax.inject (JSR-330) –@Inject – an injection target –@Named – string qualifier –@Qualifier – identifes qualifier annotations javax.enterprise.inject (JSR-299) –@Produces – an injection source –@Any – no qualifiers –Instance -- runtime source for Bean v13042623JNDI ENC

24 Enterprise Java CDI: Producer Field, Named Qualifiers, and Injection public class SchedulerResources { @PersistenceContext(name="jndidemo") @Produces @Named("jndidemo") public EntityManager em; @Stateless public class TrainSchedulerEJB extends SchedulerBase implements TrainSchedulerRemote { @Inject @Named("jndidemo") private EntityManager em; v13042624JNDI ENC

25 Enterprise Java CDI: Method Producer and Annotation Qualifier public class SchedulerResources { @Produces @JndiDemo public EntityManager getEM() { return em; } import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.RetentionPolicy.*; import static java.lang.annotation.ElementType.*; import javax.inject.Qualifier; @Qualifier @Retention(RUNTIME) @Target({METHOD, FIELD, PARAMETER, TYPE}) public @interface JndiDemo { } @Stateless public class TrainSchedulerEJB extends SchedulerBase implements TrainSchedulerRemote { @Inject @JndiDemo private EntityManager em2; v13042625JNDI ENC

26 Enterprise Java CDI: JNDI Resource public class SchedulerResources { @Resource(mappedName="java:jboss/datasources/ExampleDS") @Produces @JndiDemo public DataSource ds; @Stateless public class TrainSchedulerEJB extends SchedulerBase implements TrainSchedulerRemote { @Inject @JndiDemo private DataSource ds; v13042626JNDI ENC

27 Enterprise Java CDI: String Resource public class SchedulerResources { @Produces @JndiDemo public String message="Hello CDI!!!"; @Stateless public class TrainSchedulerEJB extends SchedulerBase implements TrainSchedulerRemote { @Inject @JndiDemo String message; v13042627JNDI ENC

28 Enterprise Java CDI: EJB Resource, @Any, Instance public class SchedulerResources { @EJB(lookup= "java:app/jndiDemoEJB/CookEJB!ejava.examples.jndidemo.ejb.CookLocal" ) @Produces @Cook public Scheduler cook; @Stateless public class TrainSchedulerEJB extends SchedulerBase implements TrainSchedulerRemote { @Inject @Any protected Instance anyCook; protected Scheduler cook2; import javax.enterprise.util.AnnotationLiteral; public class CookQualifier extends AnnotationLiteral { } cook2 = anyCook.select(new CookQualifier()).get(); 28

29 Enterprise Java CDI: Bean Resource @Named public class JPASchedulerDAOImpl extends JPADAOBase implements SchedulerDAO { … @Stateless public class TrainSchedulerEJB extends SchedulerBase implements TrainSchedulerRemote { @Inject protected SchedulerDAO schedulerDAO; @Inject protected JPASchedulerDAOImpl jpaSchedulerDAOImpl; v13042629JNDI ENC (assignable)

30 Enterprise Java CDI: Bean Resource and @Typed @Typed({SchedulerDAO.class, JPASchedulerDAOImpl.class}) public class JPASchedulerDAOImpl extends JPADAOBase implements SchedulerDAO { … @Stateless public class TrainSchedulerEJB extends SchedulerBase implements TrainSchedulerRemote { @Inject protected SchedulerDAO schedulerDAO; @Inject protected JPASchedulerDAOImpl jpaSchedulerDAOImpl; v13042630JNDI ENC (not assignable)

31 Enterprise Java CDI: Injecting into POJOs public class JPASchedulerDAOImpl @Inject @Named("jndidemo") public void setEntityManager(EntityManager em) { super.em = em; } @Override public String toString() { return new StringBuilder(super.toString()).append(", em=" + em).toString(); } v13042631JNDI ENC

32 Enterprise Java CDI: @PostConstruct @PostConstruct public void init() { log.info("******************* TrainScheduler Created ******************"); log.debug("ctx=" + ctx); log.debug("em=" + em); log.debug("em=" + em2); log.debug("ds=" + ds); log.debug("message=" + message); log.debug("cook=" + cook); cook2 = anyCook.select(new CookQualifier()).get(); log.debug("cook2=" + cook2); log.debug("schedulerDAO=" + schedulerDAO); log.debug("jpaSchedulerDAOImpl=" + jpaSchedulerDAOImpl); } v13042632JNDI ENC

33 Enterprise Java CDI: Population Output ******************* TrainScheduler Created ****************** ctx=org.jboss.as.ejb3.context.SessionContextImpl@1b9d518 em=org.jboss.as.jpa.container.TransactionScopedEntityManager@1553d64 em=org.jboss.as.jpa.container.TransactionScopedEntityManager@131a01b ds=org.jboss.jca.adapters.jdbc.WrapperDataSource@1839aa9 message=Hello CDI!!! cook=Proxy for view class: ejava.examples.jndidemo.ejb.CookLocal of EJB: CookEJB cook2=Proxy for view class: ejava.examples.jndidemo.ejb.CookLocal of EJB: CookEJB schedulerDAO=ejava.examples.jndidemo.dao.JPASchedulerDAOImpl@106504d, em=org.jboss.as.jpa.container.TransactionScopedEntityManager@18215b6 jpaSchedulerDAOImpl=ejava.examples.jndidemo.dao.JPASchedulerDAOImpl@15f65a1, em=org.jboss.as.jpa.container.TransactionScopedEntityManager@931d5 v13042633JNDI ENC

34 Enterprise Java CDI: beans.xml ***REQUIRED*** –Triggers CDI Processing META-INF/beans.xml for EJBs WEB-INF/beans.xml for WARs Can be empty <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> v13042634JNDI ENC

35 Enterprise Java JNDI Clients Portable EJB JNDI Names RMI Clients –JBoss Remoting –JBoss EJB Client v13042635JNDI ENC

36 Enterprise Java Portable JNDI Names EJB Spec defines a standard naming scheme java:global[/ ]/ / [! ] –“java:” - JNDI naming strategy –“global” – JNDI context –app-name – used only when packaged in.ear Defaults to EAR basename Can be specified in application.xml#application-name –module-name – name of module housing session bean Defaults to module.ejb archive basename Can be specified in ejb-jar.xml#module-name or web.xml#module-name –bean-name Set to EJB bean-name EJB bean-name can be set using @annotation or ejb-jar.xml –fully-qualified-interface-name v13042636JNDI ENC

37 Enterprise Java Other Contexts java:app –Unique namespace within deployed application java:app/ / [! ] java:module –Unique namespace within deployed module java:module/ [! ] v13042637JNDI ENC

38 Enterprise Java Example Application |-- jndiDemoEJB.jar |-- lib | `-- ejava-util-3.0.2012.2-SNAPSHOT.jar `-- META-INF `-- application.xml <application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instancehttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6"> jndiDemoEAR jndiDemoEJB.jar lib v13042638JNDI ENC

39 Enterprise Java Forming the JNDI Name java:global/jndiDemoEAR/jndiDemoEJB/CookEJB!ejava.examples.jndidemo.ej b.CookLocal jndiDemoEAR jndiDemoEJB.jar lib @Stateless public class CookEJB implements CookLocal { package ejava.examples.jndidemo.ejb; @Local public interface CookLocal { v13042639JNDI ENC

40 Enterprise Java Example: Deployed JNDI Tree Internal Names java:global/jndiDemoEAR/jndiDemoEJB/AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerLocal java:app/jndiDemoEJB/AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerLocal java:module/AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerLocal java:global/jndiDemoEAR/jndiDemoEJB/AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerRemote java:app/jndiDemoEJB/AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerRemote java:module/AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerRemote (JBoss) External Names java:jboss/exported/jndiDemoEAR/jndiDemoEJB/AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerR emote v13042640 JNDI ENC

41 Enterprise Java JBoss Remoting (JBoss) jndi.properties java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory java.naming.factory.url.pkgs= java.naming.provider.url=remote://127.0.0.1:4447 java.naming.security.principal=known java.naming.security.credentials=password jboss.naming.client.ejb.context=true (JBoss) Client JNDI Name jndiDemoEAR/jndiDemoEJB/AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerRemote v13042641JNDI ENC

42 Enterprise Java JBoss EJB Client (JBoss) jndi.properties java.naming.factory.initial= java.naming.factory.url.pkgs=org.jboss.ejb.client.naming java.naming.provider.url= java.naming.security.principal= java.naming.security.credentials= jboss-ejb3.properties remote.connections=default remote.connection.default.host=127.0.0.1 remote.connection.default.port=4447 remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false (JBoss) Client JNDI Name –ejb:jndiDemoEAR/jndiDemoEJB//AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerRemote –ejb:jndiDemoEAR/jndiDemoEJB//AidScheduler!ejava.examples.jndidemo.ejb.AidSchedulerRemote?stateful v13042642JNDI ENC

43 Enterprise Java Client Lookup String jndiName=… javax.naming.Context jndi = new javax.naming.InitialContext(); AidScheduerRemote scheduler = (AidSchedulerRemote)jndi.lookup(jndiName); v13042643JNDI ENC

44 Enterprise Java v13042644 Summary Populate –XML –Annotations –CDI Lookup –JNDI –SessionContext Property Assignment –Lookup –Dependency Injection JNDI ENC

45 Enterprise Java v13042645 References “Enterprise JavaBeans 3.0, 5 th Edition”; Burke & Monsen-Haefel; ISBN 0-596-00978-X; O'Reilly JSR 299: Contexts and Dependency Injection for the Java TM EE platform –http://www.jcp.org/en/jsr/detail?id=299http://www.jcp.org/en/jsr/detail?id=299 JNDI ENC


Download ppt "Enterprise Java v1304261 JNDI Enterprise Naming Conext (ENC) and Injection JNDI ENC."

Similar presentations


Ads by Google