【发布时间】:2015-02-10 23:36:25
【问题描述】:
我需要在两个 Web 应用程序之间进行通信。两者都是tomcat项目。我想避免使用 http 请求进行通信。在做了一些研究后,我发现有一个 ServletContext 对象可以处理这个问题。
我按照http://blog.imaginea.com/cross-context-communication-between-web-applications/ 上的指南进行操作,并决定在我自己的快速入门中尝试一下。
我确保我的 tomcat 服务器的 crossContext 设置为 true。
<Context crossContext="true">
我创建了两个检票口快速入门,一个名为 bar,一个名为 foo。我的想法是我可以从 bar 调用 foo 中的函数。
这里是bar中的代码
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 的类。 但是,当我在更改类加载器后尝试加载类时,我得到一个“ClassNotFoundException:com.foo.SomeUtil”。我真的不知道我做错了什么。
提前感谢任何帮助。
【问题讨论】:
标签: java tomcat servlets wicket