2014-01-16 39 views
2

我是Java新手,开发了一个示例Java EE应用程序,它与普通的Java客户端一起工作,但它不适用于Servlet。我使用Application Client,EJB模块和Web模块在Netbeans IDE中开发了EE项目。EJB容器初始化错误,EJB绑定时JNDI名称***出错***

Customer.java

@Entity 
@Table(name = "customer") 
public class Customer implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@Column (name="id") 
private String id; 
@Column (name="name") 
private String name; 

public void setName(String name) { 
    this.name = name; 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

myBeanInterface.java

import Entities.Customer; 
import javax.ejb.Remote; 
@Remote 
public interface myBeanInterface { 
    void addCustomer(Customer customer);  
} 

CustomerSession.java

@Stateless 
public class CustomerSession implements myBeanInterface { 
@PersistenceContext(unitName = "Omazon-EJBPU") 
EntityManager em; 

@Override 
public void addCustomer(Customer customer) 
{ 
    em.persist(customer); 
} 

Java客户端

@EJB 
private static myBeanInterface inter; 
public static void main(String[] args) throws NamingException { 

    InitialContext context = new InitialContext(); 
    inter = (myBeanInterface) context.lookup("Session.myBeanInterface"); 
    Customer customer = new Customer(); 
    customer.setId("16906"); 
    customer.setName("My book from Main"); 
    inter.addCustomer(customer); 
} 

的Servlet

public class addCustomerServlet extends HttpServlet { 

@EJB 
public myBeanInterface myBean; 
protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException , NamingException { 


    InitialContext context = new InitialContext(); 

    myBean = (myBeanInterface) context.lookup("Session.myBeanInterface"); 
    Customer customer = new Customer(); 
    customer.setId("1198"); 
    customer.setName("i1787"); 
    myBean.addCustomer(customer); 
    response.setContentType("text/html;charset=UTF-8"); 
    try (PrintWriter out = response.getWriter()) { 
     /* TODO output your page here. You may use following sample code. */ 
     out.println("<!DOCTYPE html>"); 
     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Servlet addCustomerServlet</title>");    
     out.println("</head>"); 
     out.println("<body>"); 
     out.println("<h1>Servlet addCustomerServlet at " + request.getContextPath() + "</h1>"); 
     out.println("</body>"); 
     out.println("</html>"); 
    } 
} 

错误

INFO: visiting unvisited references 
INFO: visiting unvisited references 
INFO: visiting unvisited references 
INFO: visiting unvisited references 
INFO: visiting unvisited references 
INFO: EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b 
INFO: file:/C:/Users/Irfan/Documents/NetBeansProjects/TestWeb/build/web/WEB- INF/lib/Omazon-EJB.jar_Omazon-EJBPU login successful 
SEVERE: Exception while invoking class org.glassfish.ejb.startup.EjbDeployer load method 
java.lang.RuntimeException: EJB Container initialization error 
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:234) 
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:291) 
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:99) 
at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:206) 
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:313) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:493) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219) 
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:356) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674) 
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534) 
at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224) 
at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246) 
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) 
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 
at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.RuntimeException: Error while binding JNDI name Session.myBeanInterface for EJB CustomerSession 
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1552) 
at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:190) 
at com.sun.ejb.containers.StatelessContainerFactory.createContainer(StatelessContainerFactory.java:63) 
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:221) 
... 38 more 
Caused by: javax.naming.NameAlreadyBoundException: Use rebind to override 
at com.sun.enterprise.naming.impl.TransientContext.doBindOrRebind(TransientContext.java:322) 
at com.sun.enterprise.naming.impl.TransientContext.bind(TransientContext.java:257) 
at com.sun.enterprise.naming.impl.SerialContextProviderImpl.bind(SerialContextProviderImpl.java:85) 
at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.bind(LocalSerialContextProviderImpl.java:94) 
at com.sun.enterprise.naming.impl.SerialContext.bind(SerialContext.java:640) 
at com.sun.enterprise.naming.impl.SerialContext.bind(SerialContext.java:657) 
at javax.naming.InitialContext.bind(InitialContext.java:423) 
at javax.naming.InitialContext.bind(InitialContext.java:423) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.publishObject(GlassfishNamingManagerImpl.java:212) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.publishObject(GlassfishNamingManagerImpl.java:196) 
at com.sun.ejb.containers.BaseContainer$JndiInfo.publish(BaseContainer.java:4859) 
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1539) 
... 41 more 

SEVERE: Exception during lifecycle processing 
java.lang.RuntimeException: EJB Container initialization error 
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:234) 
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:291) 
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:99) 
at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:206) 
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:313) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:493) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219) 
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:356) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674) 
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534) 
at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224) 
at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246) 
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) 
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 
at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.RuntimeException: Error while binding JNDI name Session.myBeanInterface for EJB CustomerSession 
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1552) 
at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:190) 
at com.sun.ejb.containers.StatelessContainerFactory.createContainer(StatelessContainerFactory.java:63) 
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:221) 
... 38 more 
Caused by: javax.naming.NameAlreadyBoundException: Use rebind to override 
at com.sun.enterprise.naming.impl.TransientContext.doBindOrRebind(TransientContext.java:322) 
at com.sun.enterprise.naming.impl.TransientContext.bind(TransientContext.java:257) 
at com.sun.enterprise.naming.impl.SerialContextProviderImpl.bind(SerialContextProviderImpl.java:85) 
at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.bind(LocalSerialContextProviderImpl.java:94) 
at com.sun.enterprise.naming.impl.SerialContext.bind(SerialContext.java:640) 
at com.sun.enterprise.naming.impl.SerialContext.bind(SerialContext.java:657) 
at javax.naming.InitialContext.bind(InitialContext.java:423) 
at javax.naming.InitialContext.bind(InitialContext.java:423) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.publishObject(GlassfishNamingManagerImpl.java:212) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.publishObject(GlassfishNamingManagerImpl.java:196) 
at com.sun.ejb.containers.BaseContainer$JndiInfo.publish(BaseContainer.java:4859) 
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1539) 
... 41 more 

SEVERE: Exception while loading the app 
SEVERE: The web application [unknown] created a ThreadLocal with key of type [org.glassfish.pfl.dynamic.codegen.impl.CurrentClassLoader$1] (value [[email protected]b721]) and a value of type [org.glassfish.web.loader.WebappClassLoader] (value [WebappClassLoader (delegate=true; repositories=WEB-INF/classes/)]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. 
INFO: file:/C:/Users/Documents/NetBeansProjects/TestWeb/build/web/WEB-INF/lib/Omazon-EJB.jar_Omazon-EJBPU logout successful 
SEVERE: Exception while loading the app : EJB Container initialization error 
java.lang.RuntimeException: Error while binding JNDI name Session.myBeanInterface for EJB CustomerSession 
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1552) 
at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:190) 
at com.sun.ejb.containers.StatelessContainerFactory.createContainer(StatelessContainerFactory.java:63) 
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:221) 
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:291) 
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:99) 
at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:206) 
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:313) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:493) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219) 
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:356) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674) 
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534) 
at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224) 
at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246) 
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) 
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 
at java.lang.Thread.run(Thread.java:744) 
Caused by: javax.naming.NameAlreadyBoundException: Use rebind to override 
at com.sun.enterprise.naming.impl.TransientContext.doBindOrRebind(TransientContext.java:322) 
at com.sun.enterprise.naming.impl.TransientContext.bind(TransientContext.java:257) 
at com.sun.enterprise.naming.impl.SerialContextProviderImpl.bind(SerialContextProviderImpl.java:85) 
at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.bind(LocalSerialContextProviderImpl.java:94) 
at com.sun.enterprise.naming.impl.SerialContext.bind(SerialContext.java:640) 
at com.sun.enterprise.naming.impl.SerialContext.bind(SerialContext.java:657) 
at javax.naming.InitialContext.bind(InitialContext.java:423) 
at javax.naming.InitialContext.bind(InitialContext.java:423) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.publishObject(GlassfishNamingManagerImpl.java:212) 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.publishObject(GlassfishNamingManagerImpl.java:196) 
at com.sun.ejb.containers.BaseContainer$JndiInfo.publish(BaseContainer.java:4859) 
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1539) 
... 41 more 
+0

它似乎是在部署时引发异常,请确保您的应用已打包良好。 “由:javax.naming.NameAlreadyBoundException导致:使用rebind来覆盖”这告诉我,你试图部署ejb两次。在修复你的ejb客户端代码之前,你需要解决这个异常。 –

+0

谢谢,问题我知道它说什么,但我不知道如何解决它。我用rebind,但错误是一样的。 – Kahn

回答

7

我通过查找一些论坛里面规定后解决了这个问题:
禁用GlassFish Server v2供应商特定的JNDI名称
GlassFish Server 3.1支持的EJB 3.1规范定义了可移植的EJB JNDI名称。因此,不再需要继续使用旧的供应商特定的JNDI名称。

默认情况下,GlassFish Server v2特定的JNDI名称由GlassFish Server 3.1自动应用,以实现向后兼容。 但是,这可能会导致一些易用的问题。例如,部署包含远程EJB组件的两个不同应用程序会暴露相同的远程接口 会导致默认JNDI名称之间的冲突。

在GlassFish应用服务器3.1的特定V2-JNDI名称的默认处理可以使用asadmin命令或禁止,不可移植,JNDI的名称布尔属性 在GlassFish中,EJB-JAR的EJB容器元素进行管理。 XML。

使用asadmin命令或直接修改glassfish-ejb-jar.xml文件来设置disable-nonportable-jndi-names属性。
使用asadmin命令:
的asadmin>设置server.ejb-container.property.disable-不可移植-JNDI-名称= “真”
直接修改的glassfish-ejb-jar.xml文件。
将disable-nonportable-jndi-names属性添加到glassfish-ejb-jar.xml中的ejb-container元素。 根据需要设置disable-nonportable-jndi-names布尔值的值。 false - 启用自动使用GlassFish Server v2特定的JNDI名称。这是默认设置。

true - 禁用自动使用特定于v2的JNDI名称。在所有情况下,将使用3.1兼容的JNDI名称。

保存glassfish-ejb-jar.xml文件并重新启动GlassFish服务器域。 此设置适用于部署到服务器的所有EJB。