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/