Jboss wildfly:如何从http servlet调用EJB
在wildfly(版本23)中,我尝试调用EJB3.0bean时出错,该bean在tserver.jar中用@Stateless注释声明: 起初,即使是查找也会失败: javax.ejb.NoSuchEJBException:ejbclient00079:无法发现“TServerXmlRpc/tserver/MFProLoginBean”的ejb无状态ejblocator请求的目标,视图为接口it.company.tserver.beans.mfpro.login.MFProLogin,关联为None 现在我得到: org.jboss.ejb.client.RequestSendFailedException:EJBCLIENT000409:没有更多可用的目标 我可以调试被正确调用的http servlet,我把它作为.war和.ear,我可以从一个独立的java程序中查找bean,要调用它,我需要服务器端代码,我还没有尝试过。 在我试图从JBoss4.2.3迁移的应用程序中,我可以从其他jboss测试调用类似的bean 可能是什么问题,有什么建议吗 这是从远程java客户端进行的客户端调用:Jboss wildfly:如何从http servlet调用EJB,jboss,ejb,wildfly,war,ear,Jboss,Ejb,Wildfly,War,Ear,在wildfly(版本23)中,我尝试调用EJB3.0bean时出错,该bean在tserver.jar中用@Stateless注释声明: 起初,即使是查找也会失败: javax.ejb.NoSuchEJBException:ejbclient00079:无法发现“TServerXmlRpc/tserver/MFProLoginBean”的ejb无状态ejblocator请求的目标,视图为接口it.company.tserver.beans.mfpro.login.MFProLogin,关联为N
package client;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;
import ejb3.CallerRemote;
public class Client {
public static void main(String ar[]) throws Exception {
Context context=null;
try {
Properties props = new Properties();
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
//props.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");// test
//props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
context = new InitialContext(props);
System.out.println("\n\tGot initial Context: "+context);
} catch (Exception e) {
e.printStackTrace();
}
Object test=context.lookup("ejb:TServerXmlRpc/MFProLoginBean!it.company.tserver.beans.mfpro.login.MFProLogin");
// When the invocation starts you try stopping the WildFly and then restart it back to find out if client reconnection works or not.
CallerRemote remote=(CallerRemote)context.lookup("ejb:TestEAR/remoteEjbOne/CallerBean!ejb3.CallerRemote");
for (int i = 0; i <= 300; i++) {
try {
System.out.println("\n\t remote.testMethod(\"MiddlewareMagic!!!\") = "+remote.testMethod("MiddlewareMagic!!!"));
Thread.sleep(500);
} catch(Exception e) {
System.out.println("\n\tEXCEPTION: " + e.getMessage());
e.printStackTrace();
try{ Thread.sleep(500); } catch(InterruptedException ee) { ee.printStackTrace(); }
}
}
}
}
我也试着把战争放在耳朵里:
META-INF\MANIFEST.MF
META-INF\application.xml
META-INF\jboss-ejb-client.properties
TServerXmlRpc.war
tserver.jar
lib\LogManager.jar
lib\compass-core.jar
lib\xmlrpc-common-3.1.3.jar
lib\xmlrpc-server-3.1.3.jar
此外,下拖中的wildfly 404错误可能是由于什么原因造成的:
2021-04-21 06:33:53910调试[io.undertow.request](默认I/O-1)匹配默认处理程序路径/unified invoker/JNDIFORY/ejb/v1/invoke/-/JBossTest server/-/EJB3TestBean/-/it.company.tserver.beans.ejbtest.EJB3Test/test/int/java.util.Date
2021-04-21 06:33:53916调试HttpServerExchange{POST/unified invoker/JNDIFactory/ejb/v1/invoke/-/JBossTest server/-/EJB3TestBean/-/it.onetech.tserver.beans.ejbtest.EJB3Test/test/int/java.util.Date}的响应代码设置为[404]
是否可以禁用java.lang.SecurityException的EJB身份验证:WFHTTP000008:身份验证失败
更新:
它似乎适用于这种情况:
put(Context.INITIAL\u Context\u FACTORY,org.jboss.naming.remote.client.InitialContextFactory)
props.put(Context.PROVIDER\u URL,“远程+http://172.21.93.102:8080”;
使用ejb:path和此建议似乎都有效:
请注意,http远程处理客户端假定远程查找中的JNDI名称是相对于java:jboss/exported命名空间的,则绝对JNDI名称的查找将失败
i、 e.在server.log中查找java:jboss/exported之后的路径
我怀疑在战争中调用EJB有什么奇怪之处
“导出”仅适用于声明为“@remote”的bean?
如何调用声明为“@local”的bean
使用props.put(Context.PROVIDER\u URL,“远程+http://localhost:8080”;
在jboss服务器端
更新:
我有一个模式,其中bean(在遗留应用程序中)同时具有本地和远程接口,如下所述:
因此,我找到了本地bean的示例:
我看到他们没有使用@Local注释,而是使用@Remote(?),所以我将本地接口转换为远程接口,它显示在ejb:methodLocal名称空间中,如果有人有任何线索的话,它似乎可以从jboss和jdni中调用
2021-04-24 23:31:38,016 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-2) WFLYEJB0473: JNDI bindings for session bean named 'DataUpdateCheckerBean' in deployment unit 'deployment "TServerXmlRpc.war"' are as follows:
java:global/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
java:app/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
java:module/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
java:jboss/exported/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
**ejb:/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal**
java:global/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
java:app/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
java:module/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
java:jboss/exported/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
ejb:/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
我更新了问题的主体,这似乎是一个笑话,但老实说,我正在尝试将现有的jboss 4.2.3 war应用程序迁移到wildfly,以防任何可能的cluesI引用了一个示例,该示例演示了如何使用@EJB proxy查找和调用本地bean,而不是jndi上下文查找和调用
2021-04-24 23:31:38,016 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-2) WFLYEJB0473: JNDI bindings for session bean named 'DataUpdateCheckerBean' in deployment unit 'deployment "TServerXmlRpc.war"' are as follows:
java:global/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
java:app/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
java:module/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
java:jboss/exported/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal
**ejb:/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateCheckerLocal**
java:global/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
java:app/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
java:module/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
java:jboss/exported/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker
ejb:/TServerXmlRpc/DataUpdateCheckerBean!it.company.tserver.beans.dataupdate.DataUpdateChecker