部署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[/align]
@Local(FactoryFacadeLocal.class)
@LocalBinding(jndiBinding="FactoryBean")
2、访问的页面改成如下内容
FactoryFacadeLocal facadeLoc(FactoryFacadeLocalcontext.lookup("FactoryBean");--------------------编程问答-------------------- 这个是打包成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 开发