但在 Websphere 7 Application Server 上就不是這回事了,需要自行設定 JNDI 讓 Seam 找得到 (將 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" />
最後就是設定 Websphere 的 EJB 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" />
相關書籍: