【问题标题】:Use Grizzly as a web service engine使用 Grizzly 作为 Web 服务引擎
【发布时间】:2014-02-18 07:37:43
【问题描述】:

我正在尝试创建一个 Grizzly Web 服务引擎,但缺少一些元素。

这是我想做的:

  • 将 Grizzly 服务器创建为可执行 jar(可以)

  • 此服务器必须能够查看 Web 服务存档的文件夹(包含在 jar 或 war 或其他中)

  • 服务器应公开此 Web 服务。

我已经知道的:

  • Web 服务可以构建为 servlet(似乎 Grizzly 能够运行 servlet,但我没有找到任何关于如何加载包含在“.war”或其他文件中的外部 serlvet)

  • 我尝试使用 ClassLoader 加载以“.jar”导出的 JAX-RS2 Web 服务,但 @path 绑定不起作用(我可能遗漏了一些内容)

我想知道的:

  • 我应该为 Web 服务存档使用哪种类型的存档?

  • Web 服务应该是 servlet 吗?在这种情况下,如何使用 Grizzly 动态加载 servlet?

  • 我是不是走错方向了?

这是我使用类加载器所做的

File file  = new File("c:\\Users\\User\\Desktop\\myresource.jar");
 URL url = file.toURI().toURL();  
 URL[] urls = new URL[]{url};
 ClassLoader cl = new URLClassLoader(urls);

URLClassLoader child = new URLClassLoader (urls, this.getClass().getClassLoader());

Class<?> classToLoad = Class.forName ("Test.ExternalWS.MyResource", true, child);
Method method = classToLoad.getDeclaredMethod ("getIt");
Object instance = classToLoad.newInstance ();
Object result = method.invoke (instance);
this.WSInstance = classToLoad.newInstance();
  • 这里是网络服务

    @Path("我的资源") 公共类 MyResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return "Got it!";
    }
    

    }

当我尝试访问 localhost:8080/....../myresource 时没有任何反应。

我尝试了所有可能的 url 并设置了一个断点...从未到达。

【问题讨论】:

    标签: java web-services rest servlets grizzly


    【解决方案1】:

    您使用的是 Grizzly 1.x 还是 2.x 分支?

    我在 Grizzly 1.x 中开发 Grizzly Deployer。您应该检查源代码是否满足您的需要

    【讨论】:

      【解决方案2】:

      不确定您使用的是哪个 Jersey 版本。 在 Jersey 2 中,我以这种方式工作:

          File file = new File("/path/resource1.jar");
          URL url = file.toURI().toURL();
          URL[] urls = new URL[]{url};
          ClassLoader cl = new URLClassLoader(urls, Main.class.getClassLoader());
      
          ResourceConfig rc = new ResourceConfig()
                  .setClassLoader(cl)
                  .files("/path/resource1.jar");
          HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(
                  BASE_URI, rc);
      

      可能有更优雅的方式...

      【讨论】:

      • 谢谢阿列克谢。我不知道 resourceConfig 的 setClassLoader() 和 files() 方法。我查看了 Jersey 文档,并没有指定使用 files() 需要类加载器。我尝试仅使用 files(),但出现以下错误: 已识别类名 com.MyWS.MyResource 的类文件,但找不到该类。很有趣。
      • 我将更深入地了解这个 files() 方法。找到一些文档并不容易。即使是泽西岛的文档也不是很丰富。稍后我会再发一篇文章,当我知道更多时。
      • 顺便说一句,是的,我正在使用 Jersey 的最新版本:2.5
      猜你喜欢
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多