java - Tomcat ServletContext 无法加载类

标签 java tomcat servlets wicket

我需要在两个网络应用程序之间进行通信。都是tomcat项目。我想避免使用 http 请求进行通信。在做了一些研究之后,我发现有一个 ServletContext 对象可以处理这个问题。

我正在按照 http://blog.imaginea.com/cross-context-communication-between-web-applications/ 上的指南进行操作并决定在我自己的快速入门中尝试这个。

我确保我的 tomcat 服务器已将其 crossContext 设置为 true。

<Context crossContext="true">

我创建了两个 wicket quickstarts,一个名为 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 的类。 但是当我在更改类加载器后尝试加载类时,我得到一个“ClassNotFoundException:com.foo.SomeUtil”。我真的不知道我做错了什么。

提前感谢任何帮助。

最佳答案

即使将 CrossContext 设置为 true,调用类的 ClassLoader 也需要访问它尝试加载的类。

尝试将包含类的 jar 部署到两个 Web 应用程序。

引自教程:

Solution-1: If we could externalize the custom data type classes which are accessed by multiple web applications (here accessed by ‘Foo’ and ‘Bar’) to a different library and place it inside the commons library location of the web container (In case of tomcat, it is <TOMCAT_HOME>\lib),

要么将 jar 部署到两个 webapps,要么部署到 commons/lib,但据我所知,默认情况下,较新版本的 tomcat 不再提供 commons/lib

关于java - Tomcat ServletContext 无法加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443957/

相关文章:

java - GWT 中的操作处理程序和小部件

java - 遍历键集与遍历条目集

java - 带有 Jetty 错误的 Spring Boot

java - Tomcat 7.0 启动时抛出错误

tomcat 日志记录 stdout stderr

java - 获取错误 "Tomcat was unable to start within 45 seconds."

java - 理解servlet中的方法调用

Java SE - 自定义按钮(Jcomponent)和 ActionListener?

java - JSON 和 java servlet

servlets - 在 servlet 中打开 html 文件