Fork me on GitHub

Programming Design Notes

Seam 2 in Websphere 7 EJB JNDI Setting

| Comments

SeamJBoss Application Server 上將 EJB session bean 設為 Seam Component 根本不需要特地去設定 JNDISeam 自然地找到相對應的 Session bean

但在 Websphere 7 Application Server 上就不是這回事了,需要自行設定 JNDISeam 找得到 (將 EJB session bean 設為 Seam Component 才需要更改 JNDI,純 EJB session bean 不需要作出任何更改)

這篇文章只使用我認為最好的方法。

首先到 web.xml 加上以下設定:

<ejb-local-ref>
<ejb-ref-name>ejblocal:EjbSynchronizations</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home></local-home>
<local>org.jboss.seam.transaction.LocalEjbSynchronizations</local>
</ejb-local-ref>

然後在 WEB-INF/classes 加入一個 seam-jndi.prpperties:
com.ibm.websphere.naming.hostname.normalizer=com.ibm.ws.naming.util.DefaultHostnameNormalizer
java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
com.ibm.websphere.naming.name.syntax=jndi
com.ibm.websphere.naming.namespace.connection=lazy
com.ibm.ws.naming.ldap.ldapinitctxfactory=com.sun.jndi.ldap.LdapCtxFactory
com.ibm.websphere.naming.jndicache.cacheobject=populated
com.ibm.websphere.naming.namespaceroot=defaultroot
com.ibm.ws.naming.wsn.factory.initial=com.ibm.ws.naming.util.WsnInitCtxFactory
com.ibm.websphere.naming.jndicache.maxcachelife=0
com.ibm.websphere.naming.jndicache.maxentrylife=0
com.ibm.websphere.naming.jndicache.cachename=providerURL
java.naming.provider.url=corbaloc:rir:/NameServiceServerRoot
java.naming.factory.url.pkgs=com.ibm.ws.runtime\:com.ibm.ws.naming

再將 WEB-INF/components.xml 內的 jndi-pattern 更改為:
<core:init 
jndi-pattern="ejblocal:#{ejbName}"
debug="false" />

最後就是設定 WebsphereEJB session bean JNDI,在 EJB Project 內的 META-INF 加入 ibm-ejb-jar-bnd.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee
http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd"
version="1.0">

<session name="MyBean" simple-binding-name="MyBean" />

</ejb-jar-bnd>

simple-binding-name 就是 JNDI,這樣 Seam 會照著 components.xml 內的 jndi-pattern 去使用以下的 JNDI 找到 EJB session bean:
ejblocal:MyBean

如果 components.xml 內的 jndi-pattern 改變了,亦要去更改 simple-binding-name
例如:
<core:init 
jndi-pattern="ejblocal:myModule/#{ejbName}"
debug="false" />

simple-binding-name 亦要更改為:
<session name="MyBean" 
simple-binding-name="MyModule/myBean" />

相關書籍: Seam in ActionSeam Framework: Experience the Evolution of Java EE (2nd Edition)Pro IBM WebSphere Application Server 7 Internals (Books for Professionals by Professionals)