我需要在两个Web应用程序之间进行通信。两者都是tomcat项目。我想避免使用http请求进行通信。在做了一些研究之后,我发现有一个ServletContext对象可以解决这个问题。
我正在关注http://blog.imaginea.com/cross-context-communication-between-web-applications/的指南,并决定在我自己的快速启动中尝试这一点。
我确保我的tomcat服务器的crossContext设置为true。
<Context crossContext="true">
我创建了两个wicket快速入门,一个名为bar,另一个名为foo。我的想法是我可以从bar调用foo中的函数。
以下是条形码中的代码
String methodName = getRequest().getParameter("PARAM_METHOD");
ServletContext srcServletContext = ((WebApplication)WebApplication.get()).getServletContext();
ServletContext targetServletContext = srcServletContext.getContext("/foo");
ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
try
{
Object object = targetServletContext.getAttribute("org.apache.wicket.protocol.http.WicketServlet.CONTEXT.foo");
ClassLoader targetServiceClassLoader = targetServletContext.getClass().getClassLoader();
Thread.currentThread().setContextClassLoader(targetServiceClassLoader);
// Causes a ClassNotFoundException
Class<?> classBarService = (Class<?>)targetServiceClassLoader.loadClass("com.foo.SomeUtil");
Method getTextMethod = object.getClass().getMethod("getText", String.class);
Object someUtil = getTextMethod.invoke(object, "someUtil");
Method targetMethod = classBarService.getMethod(methodName, (Class[])null);
Object responseFromTextMethod = targetMethod.invoke(someUtil, (Object[])null);
}
catch (Exception e)
{
text += e.toString();
}
finally
{
Thread.currentThread().setContextClassLoader(currentClassLoader);
}
foo在com.foo包中有一个名为SomeUtil的类。 但是当我在更改类加载器后尝试加载类时,我得到了一个&#34; ClassNotFoundException:com.foo.SomeUtil&#34;。我无法说出我做错了什么。
提前感谢任何帮助。
答案 0 :(得分:1)
即使将CrossContext设置为true
,调用类的ClassLoader也需要访问它尝试加载的类。
尝试将包含类的jar部署到两个Web应用程序。
引用教程:
解决方案-1:如果我们可以将多个Web应用程序(此处由'Foo'和'Bar'访问)访问的自定义数据类型类外部化到另一个库,并将其放在Web的公共库位置中容器(如果是tomcat,则为&lt; TOMCAT_HOME&gt; \ lib),
要么将jar部署到webapps,要么部署到commons / lib,但AFAIK,较新版本的tomcat默认情况下不再提供commons / lib
答案 1 :(得分:0)
您是否尝试过更换
ClassLoader targetServiceClassLoader = targetServletContext.getClass().getClassLoader();
带
ClassLoader targetServiceClassLoader = object.getClass().getClassLoader();
像在教程中提出的那样?