java - 带有分布式打包的 EJB 3.x 示例应用程序的问题 - Jboss 7.x

标签 java eclipse ejb jboss7.x ejb-3.1

JBoss EAP 6.3.0.Alpha1(AS 7.4.0.Final-redhat-4)
jdk1.7.0_67
面向 Web 开发人员的 Eclipse Java EE IDE。版本:Luna Service Release 1a (4.4.1)

创建了示例 EJB 3.x 应用程序

// Stateless Bean

    package ejb3inaction.example;
    import javax.ejb.Stateless;
    @Stateless
    public class HelloUserBean implements HelloUser{
      public String sayHello(String name) { return String.format("Hello %s welcome to EJB 3.1!", name); } }

//Remote class- Just a Interface for the bean
    package ejb3inaction.example;
    import javax.ejb.Remote;
    @Remote
    public interface HelloUser {String sayHello(String name);    }

部署在Jboss中(Eclipse - 右键单击​​项目 - 运行方式 - 在服务器上运行) - 下面是服务器日志

16:26:21,770 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-11) JBAS015876: Starting deployment of "SampleEJB_3_2.jar" (runtime-name: "SampleEJB_3_2.jar")
16:26:21,770 INFO  [org.jboss.as.remoting] (MSC service thread 1-16) JBAS017100: Listening on 127.0.0.1:4447
16:26:21,770 INFO  [org.jboss.as.remoting] (MSC service thread 1-14) JBAS017100: Listening on 127.0.0.1:9999
16:26:21,926 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-5) JNDI bindings for session bean named HelloUserBean in deployment unit deployment "SampleEJB_3_2.jar" are as follows:

    java:global/SampleEJB_3_2/HelloUserBean!ejb3inaction.example.HelloUser
    java:app/SampleEJB_3_2/HelloUserBean!ejb3inaction.example.HelloUser
    java:module/HelloUserBean!ejb3inaction.example.HelloUser
    java:jboss/exported/SampleEJB_3_2/HelloUserBean!ejb3inaction.example.HelloUser
    java:global/SampleEJB_3_2/HelloUserBean
    java:app/SampleEJB_3_2/HelloUserBean
    java:module/HelloUserBean

创建了一个 SampleWebApplication 并部署在部署上述 EJB 3.x 应用程序的同一 JBoss 服务器上

java客户端

package ejb3inaction.example.utilization;
   import javax.ejb.EJB;
   import javax.naming.Context;
   import javax.naming.InitialContext;
   import javax.naming.NamingException;
   import ejb3inaction.example.HelloUser;

   public class HelloUserBeanClient{

   // EJB 3.x Client Injection      

   @EJB     
   private HelloUser helloUser;
   public String hello(){return helloUser.sayHello("Hello EJB 3.X");}

   //EJB Client Legacy Lookup support

   public String helloLegasySupport() throws NamingException{
   Context context = new InitialContext();
   HelloUser helloUser1 = (HelloUser)context.lookup("java:global/SampleEJB_3_2/HelloUserBean");
   return helloUser1.sayHello("Legacy support from EJB 3.X ");
            } }

JSP 客户端 - 依次调用 java 客户端的 View

    <jsp:useBean id="ejbClient" class="ejb3inaction.example.utilization.HelloUserBeanClient"></jsp:useBean>
    <%
    try{
    out.println(ejbClient.hello());
    }
    catch(Exception e) {
    out.println("<br > ejbTest - hello " + e.getMessage());
    }
    try{
    out.println(ejbClient.helloLegasySupport());
    }
    catch(Exception e) {
    out.println("<br > ejbTest - helloLegasySupport " + e.getMessage());
    }

访问 JSP 客户端时未找到接收类异常。但是我可以看到这两个类(HelloUserBean.class,HelloUser.class)已生成并可在“jboss-eap-6.3\standalone\deployments\SampleEJB_3_2.jar\ejb3inaction\example”

EJB 3.X 客户端支持错误 - hello()

JBWEB000071: root cause

java.lang.ClassNotFoundException: ejb3inaction.example.HelloUser from [Module "deployment.SampleWebApplication.war:main" from Service Module Loader]
    org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:197)
    org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:443)
    org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:431)
    org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:373)
    org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:118)
    ejb3inaction.example.utilization.HelloUserBeanClient.hello(HelloUserBeanClient.java:17)
    org.apache.jsp.ejbTest_jsp._jspService(ejbTest_jsp.java:78)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:365)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:309)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:242)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

旧支持错误 - helloLegasySupport()

JBWEB000071: root cause

    java.lang.ClassNotFoundException: ejb3inaction.example.HelloUser from [Module "deployment.SampleWebApplication.war:main" from Service Module Loader]
        org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:197)
        org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:443)
        org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:431)
        org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:373)
        org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:118)
        ejb3inaction.example.utilization.HelloUserBeanClient.helloLegasySupport(HelloUserBeanClient.java:22)
        org.apache.jsp.ejbTest_jsp._jspService(ejbTest_jsp.java:78)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:365)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:309)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:242)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

最佳答案

我相信问题是你的 jsp 客户端(应该在一个 war 文件中,对吧?)对你的 ejb 不可见。

尝试将两个应用程序放入一个ear文件中。通过这样做,war将能够看到ejb类,因此类加载器应该可以毫无问题地找到HelloUserBean。

顺便说一下,我会更改 ejb 注入(inject)(@EJB)。您应该注入(inject)接口(interface)(HelloUser),而不是实现。您可以找到更多信息 here

关于java - 带有分布式打包的 EJB 3.x 示例应用程序的问题 - Jboss 7.x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28542137/

相关文章:

java - 对使用逻辑运算符感到困惑

java - 从 Java 中调用 Haskell 函数的最佳方式

java - 扩展@Named @SessionScoped bean

java - 如何将 HashMap 的 Arraylist 发送到 _POST?然后如何在 PHP 中剖析数组?

java - 如何将 UTF-8 字节 block 转换为字符?

java - 如何创建 Java 独立应用程序

java - 难以通过 JButton 激活 BufferedReader

java - 如何包含依赖项目并将 jar 拆分为两个 jar?

java - EJB 方法从自身调用 : does the container have influence on it?

java - 在 EJB mdb 中初始化 Hibernate SessionFactory?