gpt4 book ai didi

tomcat - 从 Tomcat 连接到 JBoss 7.1.1 中的 EJB 时,JNDI 查找失败

转载 作者:行者123 更新时间:2023-11-28 21:55:17 30 4
gpt4 key购买 nike

有几种方法可以查找 EJB

我可以使用此查找连接到我的 ejb 服务器,但仅当我使用 ConsoleClient 时。

 "ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName)

当我在 tomcat 应用程序服务器(spring mvc 项目)上尝试此查找时,此查找将不起作用。 Jboss 以 ClassNotFoundException 响应。

我假设必须有另一个 jndi 查找名称?遗憾的是,我在网上找不到任何有用的信息。

编辑:

我的 Controller

@RequestMapping(value = "login", method = RequestMethod.POST)
public LoginBeanRemote logIn(){

final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");

Context context = null;
try {
context = new InitialContext(jndiProperties);
} catch (NamingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}


final String appName = "foo_business";
final String moduleName = "foo_business";
final String distinctName = "";
final String beanName = "LoginBean";

// gesucht ist die klasse vom jboss , nicht die im frontend
final String viewClassName = "foo.business.login.LoginBeanRemote";
System.out.println("Looking EJB via JNDI ");
System.out.println("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);

try {
return (LoginBeanRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;


}

我在我的 spring 项目根文件夹中放了一个 jboss-ejb-client.properties 文件

endpoint.name=foo_business //project name
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=127.0.0.1
remote.connection.default.port=4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

我的 LoginBean 的第一部分(在我的 JBOSS 中部署为 JAR 文件;

@Stateful
@Remote(LoginBeanRemote.class)
public class LoginBean implements LoginBeanRemote {

生成的 EJB 查找名称:

ejb:foo_business/foo_business//LoginBean!foo.business.login.LoginBeanRemote

错误:

javax.naming.NamingException: Could not load ejb proxy class recc.business.login.LoginBeanRemote [Root exception is java.lang.ClassNotFoundException: recc.business.login.LoginBeanRemote]
at org.jboss.ejb.client.naming.ejb.EjbNamingContext.createEjbProxy(EjbNamingContext.java:108)
at org.jboss.ejb.client.naming.ejb.EjbNamingContext.lookup(EjbNamingContext.java:96)
at javax.naming.InitialContext.lookup(Unknown Source)
at recc.frontend.controller.UserController.logIn(UserController.java:161)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: recc.business.login.LoginBeanRemote
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.jboss.ejb.client.naming.ejb.EjbNamingContext.createEjbProxy(EjbNamingContext.java:106)
... 36 foo

编辑:

我将 ejb-project.jar 添加到我的类路径中。此外,我将 ejb 包添加到我的 spring 项目中,并将 LoginBeanRemote 放在那里。

到目前为止,该项目没有响应 ClassNotFound 错误。当我调试创建的 LoginBeanRemote 时,它​​包含:

Proxy for remote EJB StatelessEJBLocator{appName='foo_business', moduleName='foo_business', distinctName='', beanName='LoginBean', view='interface foo.business.login.LoginBeanRemote'}

查找时无异常。

    LoginBeanRemote remote = (LoginBeanRemote) context.lookup("ejb:"
+ appName + "/" + moduleName + "/" + distinctName + "/"
+ beanName + "!" + viewClassName);
return remote;

当我尝试调用bean的一个函数时,它会引发异常

System.out.println(remote.helloBean());

完整消息:

   Aug 30, 2013 11:26:21 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/test] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No EJB receiver available for handling [appName:foo_business,modulename:foo_business,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@c7c0866] with root cause
java.lang.IllegalStateException: No EJB receiver available for handling [appName:foo_business,modulename:foo_business,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@c7c0866
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)
at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)
at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)
at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)
at com.sun.proxy.$Proxy10.helloBean(Unknown Source)
at foo.frontend.controller.UserController.logIn(UserController.java:167)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

编辑:我刚刚关闭了 JBoss,出现了同样的错误。我认为与 Jboss 根本没有任何联系。

编辑:

我刚刚更新了我的代码:

    InitialContext context = null;
try {
final Properties initialContextProperties = new Properties();

initialContextProperties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jboss.naming.remote.client.InitialContextFactory");

initialContextProperties.put(Context.PROVIDER_URL,
"remote://localhost:4447");

initialContextProperties.put(Context.URL_PKG_PREFIXES,
"org.jboss.ejb.client.naming");

initialContextProperties
.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT",
"false");

initialContextProperties.put(Context.SECURITY_PRINCIPAL, "myapplicationrealmuser");
initialContextProperties
.put(Context.SECURITY_CREDENTIALS, "mypass");

EJBClientConfiguration cc = new PropertiesBasedEJBClientConfiguration(
initialContextProperties);
ContextSelector<EJBClientContext> selector = new ConfigBasedEJBClientContextSelector(
cc);
EJBClientContext.setSelector(selector);

context = new InitialContext(initialContextProperties);
} catch (NamingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}


System.out.println("Looking EJB via JNDI ");

try {

LoginBeanRemote remote = (LoginBeanRemote) context
.lookup("java:global/foo_business/LoginBean!foo.business.login.LoginBeanRemote");
System.out.println(remote.helloBean());
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;

这将在查找期间返回 NameNotFoundException。我已经尝试了各种查找名称,但它不会像这样工作。我是否缺少某些配置?

错误:

javax.naming.NameNotFoundException: global/foo_business/LoginBean!foo.business.login.LoginBeanRemote -- service jboss.naming.context.java.jboss.exported.global.foo_business."LoginBean!foo.business.login.LoginBeanRemote"
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

JBOSS 控制台 JNDI 信息:

enter image description here

编辑:

我将 EJB 部署为 EAR 文件,仍然收到相同的异常

javax.naming.NameNotFoundException: global/foo_business_ear-ear/foo_business_ear-ejb/LoginBean!foo.business.login.LoginBeanRemote -- service jboss.naming.context.java.jboss.exported.global.foo_business_ear-ear.foo_business_ear-ejb."LoginBean!foo.business.login.LoginBeanRemote"
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

ERROR: org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1 - Channel end notification received, closing channel Channel ID ef1b671f (outbound) of Remoting connection 6af39445 to localhost/127.0.0.1:4447

最佳答案

作为客户端的 Tomcat 必须被视为不在同一个应用程序服务器容器中运行的客户端。因此,您必须将所有相关类/接口(interface)打包到部署在 Tomcat 上的 .war 文件中。

查看堆栈跟踪:JBoss 服务器 确实响应,是 JBoss 客户端 报告缺少类:

at org.jboss.ejb.client.naming.ejb.EjbNamingContext.createEjbProxy

实际错误(缺少类)打包在 NamingException 中。

因此您必须将相关类放入 Tomcat 的 .war 文件中:这可能是您的远程接口(interface) recc.business.login.LoginBeanRemote

我总是将 EJB 类(实现)和它们的接口(interface)放在两个单独的包中,EJB 客户端获得一个仅包含接口(interface)(可能还有异常)的 .jar 文件。因此,一个由接口(interface)和可能的异常组成的 .jar 被打包到客户端的 .war 中。


一般来说这些项目必须检查,如果单机客户端无法工作

  • 类路径中是否有jboss-client.jar
  • 远程接口(interface)是否在类路径中?
  • InitialContext 的属性是否完整?
  • JNDI 名称是否正确?该 JNDI 名称是否真的对客户端可见

附录:InitialContext 的属性:

    final Properties initialContextProperties = new Properties();

initialContextProperties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jboss.naming.remote.client.InitialContextFactory");

initialContextProperties.put(Context.PROVIDER_URL,
"remote://localhost:4447");

initialContextProperties.put(Context.URL_PKG_PREFIXES,
"org.jboss.ejb.client.naming");

// See .../jboss-7/standalone/configuration/application-users.properties
initialContextProperties.put(Context.SECURITY_PRINCIPAL, "user");
initialContextProperties.put(Context.SECURITY_CREDENTIALS, "password");

我已经测试了这些设置,并由 JBoss AS7 JNDI & EJB 3.1 Naming changes 确认.既不需要 jndi.properties 也不需要 jboss-ejb-client.properties

相关:JBoss AS7 JNDI reference

关于tomcat - 从 Tomcat 连接到 JBoss 7.1.1 中的 EJB 时,JNDI 查找失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18520069/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com