JBoss 有以下两种绑定规则:
缺省绑定 缺省情况下,会话 Bean 的 JNDI 绑定名称是:
* local 接口:<ejbName>/local
* remote 接口:<ejbName>/remote
当 EJB 被部署到某个 ear 中后,缺省绑定名称中会以 ear 包的名称作为前缀。比如,ear 文件是 test.ear 时,EJB 的绑定名称是:
* local 接口:test/<ejbName>/local
* remote 接口:test/<ejbName>/remote
用户自定义的绑定
Jboss 中,用户可以通过 @LocalBinding 或 @RemoteBinding 为某个 EJB 自定义JNDI 绑定名称。注意:@LocalBinding 和 @RemoteBinding 是 JBoss 自提供的扩展注释,而非 EJB 3 规范的标准注释。建议不要使用!示例:
- import org.jboss.annotation.ejb.LocalBinding;
- import org.jboss.annotation.ejb.RemoteBinding;
- @Stateless
- @RemoteBinding (jndiBinding="aaa/Remote")
- @LocalBinding (jndiBinding="mybean_Local")
- public class MyBean implements .... { ... }
在Java EE 5 中仍然支持正规的XML 发布描述符,例如Java EE 标准规定的ejb-jar.xml 和服务器特定的描述符例如jboss.xml。而且,如果配置文件中的值和标注中的发生了冲突,则以配置文件中的内容为准,ejb-jar.xml 文件需要新建在src/META-INF/目录下,在此文件中,我们主要通过配置文件定义了一个EJB,其中的ejb-name 的取值对应@Stateless 标注中的name 属性,business-local 对应本地接口,business-remote 对应远程接口,ejb-class 对应作为EJB 发布的Bean 实现类,session-type 则对应了有状态或者无状态。代码清单如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.0"
- 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_0.xsd">
- <enterprise-beans>
- <session>
- <ejb-name>MySessionBean</ejb-name>
- <business-local>conftest.NewSessionLocal</business-local>
- <business-remote>conftest.NewSessionRemote</business-remote>
- <ejb-class>conftest.NewSessionBean</ejb-class>
- <session-type>Stateless</session-type>
- </session>
- </enterprise-beans>
- </ejb-jar>
jboss.xml 也位于同一目录下,注意这个文件名完全是JBoss 规定的,属于厂商特定的配置文件(换句话说别的服务器类似的文件名将会不一样),代码清单如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <jboss>
- <enterprise-beans>
- <session>
- <ejb-name>MySessionBean</ejb-name>
- <jndi-name>MySessionBeanTest</jndi-name>
- <local-jndi-name>MySession_Local</local-jndi-name>
- <!--
- <remote-jndi-name>MySessionRemote</remote-jndi-name>-->
- </session>
- </enterprise-beans>
- </jboss>
关于获取数据源的语法,大体有(javax.sql.DataSource) ctx.lookup ("java:comp/env/XXX")和(javax.sql.DataSource) ctx.lookup("XXX")两种写法,好多人以为这两种写法是相同的,以为都是通过JNDI来获取数据源。其实java:comp/env和 JNDI是不同的,java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。ENC是一个引用,引用是用于定位企业应用程序的外部资源的逻辑名。引用是在应用程序部署描述符文件中定义的。在部署时,引用被绑定到目标可操作环境中资源的物理位置(JNDI名)。使用ENC是把对其它资源的JNDI查找的硬编码解脱出来,通过配置这个引用可以在不修改代码的情况下,将引用指向不同的EJB(JNDI)。 在J2EE中的引用常用的有:
---------JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明
---------JMS 连接工厂在java:comp/env/jms 子上下文中声明
---------JavaMail 连接工厂在java:comp/env/mail 子上下文中声明
---------URL 连接工厂在 java:comp/env/url子上下文中声明
假如你写了一个EJB,获取datasource如:dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/DBPool");
那么在配置文件中进行资源映射时,在ejb-jar.xml中,
<resource-ref>
<res-ref-name>jdbc/DBPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
在weblogic-ejb-jar.xml中,
<reference-descriptor>
<resource-description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<jndi-name>OraDataSource</jndi-name>
</resource-description>
</reference-descriptor>
//转者注:如果是在jboss则在jboss.xml中做如下修改
<resource-managers>
<resource-manager>
<res-name>jdbc/DBPool</res-name>
<res-jndi-name>OraDataSource</res-jndi-name>
</resource-manager>
</resource-managers>
实际服务器中的JNDI名字是OraDataSource,逻辑名jdbc/DBPool只是用来和它作映射的,这样做的好处是为了提高可移植性,移植的时候只需要把配置文件改一下就可以,而应用程序可不用改动。
假如你写了一个一般的应用程序,想直接通过JNDI来获取数据源,那么直接lookup(“mytest”)就可以了(假如服务器上的JNDI为mytest),用第一种写法反而会报错的。
---------JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明
---------JMS 连接工厂在java:comp/env/jms 子上下文中声明
---------JavaMail 连接工厂在java:comp/env/mail 子上下文中声明
---------URL 连接工厂在 java:comp/env/url子上下文中声明
假如你写了一个EJB,获取datasource如:dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/DBPool");
那么在配置文件中进行资源映射时,在ejb-jar.xml中,
<resource-ref>
<res-ref-name>jdbc/DBPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
在weblogic-ejb-jar.xml中,
<reference-descriptor>
<resource-description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<jndi-name>OraDataSource</jndi-name>
</resource-description>
</reference-descriptor>
//转者注:如果是在jboss则在jboss.xml中做如下修改
<resource-managers>
<resource-manager>
<res-name>jdbc/DBPool</res-name>
<res-jndi-name>OraDataSource</res-jndi-name>
</resource-manager>
</resource-managers>
实际服务器中的JNDI名字是OraDataSource,逻辑名jdbc/DBPool只是用来和它作映射的,这样做的好处是为了提高可移植性,移植的时候只需要把配置文件改一下就可以,而应用程序可不用改动。
假如你写了一个一般的应用程序,想直接通过JNDI来获取数据源,那么直接lookup(“mytest”)就可以了(假如服务器上的JNDI为mytest),用第一种写法反而会报错的。