【问题标题】:Strange exception using Jersey with embedded Jetty使用带有嵌入式码头的泽西岛的奇怪异常
【发布时间】:2016-03-13 14:44:35
【问题描述】:

我创建了一个嵌入式 Jetty 应用程序,它利用 Jersey 来实现几个 RESTful 服务。我正在使用 Stack Overflow 以及其他网站中描述的一些标准代码:

public static void main(String[] args)
{
   Server server = new Server(8080);

   ServletContextHandler ctx = new ServletContextHandler(
                                  ServletContextHandler.SESSIONS);

   ctx.setContextPath("/");

   ServletHolder holder = ctx.addServlet(
             "org.glassfish.jersey.servlet.ServletContainer.class", "/*");
   holder.setInitOrder(0);

   holder.setInitParameter("jersey.config.server.provider.classnames",
                          RestfulClass.class.getCanonicalName());

   server.setHandler(ctx);

   try
   {
      server.start();
      server.join();
   }
   catch(Exception exe)
   {
      exe.printStackTrace();
   }
}

我已经使用了所有推荐的 jar 文件,以及各种博客和网站未提及的其他几个 jar 文件。运行 Jetty 应用程序时,出现以下异常:

java.lang.ClassNotFoundException:    org.glassfish.jersey.servlet.ServletContainer.class
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.eclipse.jetty.util.Loader.loadClass(Loader.java:86)
at org.eclipse.jetty.servlet.BaseHolder.doStart(BaseHolder.java:95)

<several lines omitted for brevty>

Caused by: javax.servlet.UnavailableException: org.glassfish.jersey.servlet.ServletContainer.class
at org.eclipse.jetty.servlet.BaseHolder.doStart(BaseHolder.java:102)
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:361)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:874)
... 11 more

我不明白的是“UnavailableException”。 ServletContainer 类实际上位于其中一个 Jar 文件中(准确地说是在 jersey-container-servlet-core.jar 中),但由于某种原因,它被标识为“不可用”。这导致实际上在引用的 Jar 文件中的类“未找到”!

谁能告诉我是什么导致了这个 UnavailableException 以及(更重要的是)如何防止它被抛出?

请高人指教……

【问题讨论】:

    标签: rest jersey-2.0 embedded-jetty


    【解决方案1】:
    ServletHolder holder = ctx.addServlet(
             "org.glassfish.jersey.servlet.ServletContainer.class", "/*");
    

    您正在使用字符串作为类名。执行此操作时,不要使用.class 后缀。仅当您想获得实际的 Class 对象时。你有两个选择

    1. 从字符串中删除.class

      ServletHolder holder = ctx.addServlet(
           "org.glassfish.jersey.servlet.ServletContainer", "/*");
      
    2. 删除""(双引号),只使用Class 对象1

      ServletHolder holder = ctx.addServlet(
           org.glassfish.jersey.servlet.ServletContainer.class, "/*");
      

    1 - 见addServlet(Class, String)

    【讨论】:

    • 问候:这确实解决了问题,尽管它导致了另一个问题:我似乎缺少一个名为“javax/annotation/Priority”的类。我会尝试找到它,但这可能会成为一个新问题的主题......
    • 您需要 jaxax.inject jar。如果您不使用 maven,请转到主球衣网站并下载 RI 包。您应该使用捆绑包中的所有罐子
    • 我有注射罐。我抓住了 RI 包,并使用了那里的所有罐子。注入 jar 只有一个包:javax.inject。捆绑包中的任何 jar 中都没有 javax.annotations 包...
    • Here,我想它在这里。但我不确定为什么需要它。
    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2016-01-27
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多