我有一个应用程序,我正在将应用程序(具体来说是 EJB 应用程序)从 EJB 2.1 迁移到 EJB 3.1。
现在,我想要一个无状态 bean 的自定义 JNDI 映射。 我已使用无状态注释设置了映射名称,但它仅在 ejb-jar_merged.xml 文件中设置映射名称 XML 标记。
现在,我想以编程方式设置以下
simple-binding-name
,可能通过使用 EJB3.1 注释。这样可以吗?
我除了下面的 ibm-ejb-jar-bnd.xml 看起来像这样(可能不需要手动创建此文件)。
<session name="SomeEJBBean" simple-binding-name="ejb/org.abc.ejbclient.SomeEJBBean"/>
非常感谢任何帮助。
对于直接 EJB 查找,在 WebSphere 中为 EJB 配置自定义 JNDI 名称的唯一方法是使用
ibm-ejb-jar-bnd.xml
文件。没有从注释生成此文件的机制,也没有方法提供带有注释的自定义 JNDI 名称。
为了提高 EJB 应用程序的可移植性,EJB 3.1 规范为 java:global、java:app 和 java:module 中的所有 EJB 添加了明确定义的 JNDI 名称,但没有提供自定义这些绑定名称的方法。
EJB 规范还引入了
mappedName
和 @Stateless
注释的 @Stateful
属性。然而,该属性具有未定义的行为并且不是必需的,因此 WebSphere 选择不提供该属性的实现,因为它不可移植。
要考虑的另一个选项是应用程序可以通过使用 EJB 引用为 EJB 提供“自定义”JNDI 名称(即
<ejb-ref>
或 <ejb-local-ref>
注释中的 ejb-jar.xml
或 @EJB
)。
考虑以下示例:
@Stateless
@Remote(ClientRemote.class)
@EJB(name="java:global/env/ejb/ClientBeanRef", beanInterface=ClientRemote.class, beanName="ClientBean")
public class ClientBean
规范为
ClientBean
定义的 JNDI 名称类似于:
java:global/TestApp/TestEJBModule/ClientBean!org.test.ClientRemote
因此,可以使用此名称直接查找 bean,或者,如果使用 EJB 引用名称,则它只是:
java:global/env/ejb/ClientBeanRef
或 java:global、java:app 或 java:module 命名上下文中的
@EJB
注释上指定的任何其他名称。
请注意,为 EJB 引用提供的绑定在瘦客户端中不可见,因此如果这对您的应用程序很重要,则这可能不是一个选项。
有关 WebSphere 中其他 EJB 绑定相关选项的完整详细信息可以在此处找到: