当前位置:编程学习 > JAVA >>

部署ear的问题!!!

我写了一个ejb 和 webclient,容器为jboss,当单独部署这两个的时候,web端调用一切正常。我有建立了一个ear(enterprise java project )项目,myeclipse给我自动生成了application.xml,然后我就什么也没加, 配置如下:  
application.xml  

<?xml version="1.0" encoding="UTF-8"?>  
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd">  
  <display-name>supermaket_ALL</display-name>  
  <module id="myeclipse.1280137791699">  
  <web>  
  <web-uri>supermaket_WebClient.war</web-uri>  
  <context-root>/supermaket_WebClient</context-root>  
  </web>  
  </module>  
  <module id="myeclipse.1280132176732">  
  <ejb>supermarket_EJB.jar</ejb>  
  </module>  
</application>  

MANIFEST.MF  

Manifest-Version: 1.0  
Class-Path:  


然后我部署ear到jboss,一切正常。但随后的调用出错。  
  try {  
InitialContext context=new InitialContext();  
FactoryFacadeLocal facadeLoc(FactoryFacadeLocalcontext.lookup("FactoryBean/local");  
try {  
facadeLocal.save(null);  
System.out.println("hello!");  
} catch (Exception e) {  
e.printStackTrace();  
}  
} catch (NamingException e) {  
e.printStackTrace();  
}  
}  



ejb:  
@Stateless(name="FactoryBean")  
public class FactoryFacade implements FactoryFacadeLocal, FactoryFacadeRemote,Serializable {  
/**  
*  
*/  
private static final long serialVersionUID = -5377928730560164585L;  

public void save(Factory entity) {  

System.out.println("方法调用成功!");  
}  


ejb的接口我打包成jar 放在web项目的lib下的。

21:35:18,378 ERROR [STDERR] javax.naming.NameNotFoundException: FactoryBean not bound  
21:35:18,379 ERROR [STDERR] at org.jnp.server.NamingServer.getBinding(NamingServer.java:771)  
21:35:18,379 ERROR [STDERR] at org.jnp.server.NamingServer.getBinding(NamingServer.java:779)  
21:35:18,380 ERROR [STDERR] at org.jnp.server.NamingServer.getObject(NamingServer.java:785)  
21:35:18,380 ERROR [STDERR] at org.jnp.server.NamingServer.lookup(NamingServer.java:396)  
21:35:18,380 ERROR [STDERR] at org.jnp.inte易做图ces.NamingContext.lookup(NamingContext.java:726)  
21:35:18,380 ERROR [STDERR] at org.jnp.inte易做图ces.NamingContext.lookup(NamingContext.java:686)  
21:35:18,381 ERROR [STDERR] at javax.naming.InitialContext.lookup(InitialContext.java:392)   --------------------编程问答-------------------- 这个是打包成ear的问题,ear中可能不能按照jar和war这两种部署对应的访问代码。
我的也是在jar和war打包部署后,能访问,两个打包到一个ear文件后访问提示不能找到session bean。
通过动手实践,我是如下解决这个问题的:

1、修改你的session bean
   在session bean中改成如下注释:
           [align=center]
@Stateless
@Local(FactoryFacadeLocal.class)
@LocalBinding(jndiBinding="FactoryBean")
[/align]

2、访问的页面改成如下内容
FactoryFacadeLocal facadeLoc(FactoryFacadeLocalcontext.lookup("FactoryBean");  
--------------------编程问答-------------------- 这个是打包成ear以后,ejb的jndi名就变了,需要加上ear的名字。
have a try! --------------------编程问答-------------------- 这人,让自己的贴沉了 --------------------编程问答--------------------
引用 2 楼 goldenfish1919 的回复:
这个是打包成ear以后,ejb的jndi名就变了,需要加上ear的名字。
have a try!


当EJB发布到Jboss 时,如果我们没有为它指定全局JNDI名称或修改过其默认EJB名称,Jboss就会按照默认的命名规则为EJB生成全局JNDI名称,默认的命名规则如下:
如果把EJB作为模块打包进后缀为*.ear的JAVA EE企业应用文件,默认的全局JNDI名称是
本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
       EAR-FILE-BASE-NAME为ear文件的名称,EJB-CLASS-NAME为EJB的非限定类名。
例:把HelloWorld应用作为EJB模块打包进名为HelloWorld.ear的企业应用文件,它的远程接口的JNDI 名称是:HelloWorld/HelloWorldBean/remote

如果把EJB应用打包成后缀为*.jar的模块文件,默认的全局JNDI名称是
本地接口:EJB-CLASS-NAME/local
远程接口:EJB-CLASS-NAME/remote
例:把HelloWorld应用打包成HelloWorld.jar文件,它的远程接口的JNDI名称是:HelloWorldBean/remote
补充:Java ,  Web 开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,