EJB 的部署一向是个头疼的问题,在部署行为和默认设置上,应用服务器之间,甚至是同一服务器的不同版本之间都可能有着很大的差异。这几天刚用上JBoss 5.10GA,碰上一个傻帽问题,发现原因后差点没气得呛死。
事情是这样,照规矩我在拿到新的服务器时都要先写一个HelloWorld试验,图方便就在MyEclipse里直接建立了一个EAR项目(PlayEJB1),同时选择新建一个EJB项目和一个WEB项目。EJB项目里写了一个HelloStatelessBean,Web项目里新建一个JSP写好JNDI查找的字串如下:
"HelloStatelessBean/local"
实验证明,JNDI查找失败,抛出NameNotFoundException。
我非常奇怪,HelloStatelessBean是这个EJB 的ejbName,这在JBoss部署项目时在控制台里打印得白纸黑字的,怎么可能NameNotFound?抱着试一试的态度,我把EAR项目卸除,然后仅仅部署里面的EJB项目,这一次居然试验成功没有异常!由此想到,JBoss在部署EAR项目时很可能采用了与单独部署EJB项目不同的JNDI命名策略。仔细观察控制台消息,几行平日让我熟视无睹的INFO日志让我恍然大悟:
23:14:36,093 INFO [EJBContainer] STARTED EJB: com.jeff.ejb.HelloStatelessBean ejbName: HelloStatelessBean
23:14:36,140 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
PlayEJB1/HelloStatelessBean/remote - EJB3.x Default Remote Business Interface
PlayEJB1/HelloStatelessBean/remote-com.jeff.ejb.HelloStatelessRemote - EJB3.x Remote Business Interface
PlayEJB1/HelloStatelessBean/local - EJB3.x Default Local Business Interface
PlayEJB1/HelloStatelessBean/local-com.jeff.ejb.HelloStatelessLocal - EJB3.x Local Business Interface
原来如此!EAR项目里的EJB的JNDI,被JBoss加上了EAR项目名作为前缀,单独部署EJB项目时JNDI这样查"HelloStatelessBean/local",而在EAR里变成了"PlayEJB1/HelloStatelessBean/local"。其实JBoss这样做是有些道理的,最起码有了EAR项目名称作为命名空间,EJB的重名可能大大减少。但是开发者就倒霉了,每个服务器都有自己的个性,开始干活之前还要一个个分别调教,太累了。
事情是这样,照规矩我在拿到新的服务器时都要先写一个HelloWorld试验,图方便就在MyEclipse里直接建立了一个EAR项目(PlayEJB1),同时选择新建一个EJB项目和一个WEB项目。EJB项目里写了一个HelloStatelessBean,Web项目里新建一个JSP写好JNDI查找的字串如下:
"HelloStatelessBean/local"
实验证明,JNDI查找失败,抛出NameNotFoundException。
我非常奇怪,HelloStatelessBean是这个EJB 的ejbName,这在JBoss部署项目时在控制台里打印得白纸黑字的,怎么可能NameNotFound?抱着试一试的态度,我把EAR项目卸除,然后仅仅部署里面的EJB项目,这一次居然试验成功没有异常!由此想到,JBoss在部署EAR项目时很可能采用了与单独部署EJB项目不同的JNDI命名策略。仔细观察控制台消息,几行平日让我熟视无睹的INFO日志让我恍然大悟:
23:14:36,093 INFO [EJBContainer] STARTED EJB: com.jeff.ejb.HelloStatelessBean ejbName: HelloStatelessBean
23:14:36,140 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
PlayEJB1/HelloStatelessBean/remote - EJB3.x Default Remote Business Interface
PlayEJB1/HelloStatelessBean/remote-com.jeff.ejb.HelloStatelessRemote - EJB3.x Remote Business Interface
PlayEJB1/HelloStatelessBean/local - EJB3.x Default Local Business Interface
PlayEJB1/HelloStatelessBean/local-com.jeff.ejb.HelloStatelessLocal - EJB3.x Local Business Interface
原来如此!EAR项目里的EJB的JNDI,被JBoss加上了EAR项目名作为前缀,单独部署EJB项目时JNDI这样查"HelloStatelessBean/local",而在EAR里变成了"PlayEJB1/HelloStatelessBean/local"。其实JBoss这样做是有些道理的,最起码有了EAR项目名称作为命名空间,EJB的重名可能大大减少。但是开发者就倒霉了,每个服务器都有自己的个性,开始干活之前还要一个个分别调教,太累了。