使用嵌入式Jetty的泽西的奇怪例外

时间:2016-03-13 14:44:35

标签: rest jersey-2.0 embedded-jetty

我创建了一个嵌入式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

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

有谁能告诉我是什么导致了这个UnavailableException,(更重要的是)我怎么能阻止它被抛出?

有人请指教......

1 个答案:

答案 0 :(得分:2)

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

您正在使用String作为类名。执行此操作时,您不能使用.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, "/*");
    
  3. 1 - 见addServlet(Class, String)