使用带有嵌入式 Jetty 的 Jersey 的奇怪异常
Strange exception using Jersey with 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.run(Unknown Source)
at java.net.URLClassLoader.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 class 实际上在其中一个 Jar 文件中(准确地说是在 jersey-container-servlet-core.jar 中),但由于某种原因它被识别为 "unavailable"。这导致实际在引用的 Jar 文件中的 class 成为 "not found"!
任何人都可以告诉我是什么导致了这个 UnavailableException 以及(更重要的是)我如何防止它被抛出?
有人请指教...
ServletHolder holder = ctx.addServlet(
"org.glassfish.jersey.servlet.ServletContainer.class", "/*");
您正在为 class 名称使用字符串。这样做时,您不使用 .class
后缀。仅当您想要获取实际的 Class
对象时才这样做。你有两个选择
从字符串
中删除.class
ServletHolder holder = ctx.addServlet(
"org.glassfish.jersey.servlet.ServletContainer", "/*");
删除 ""
(双引号),只使用 Class
对象 1。
ServletHolder holder = ctx.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class, "/*");
1 - 请参见 addServlet(Class, String)
我创建了一个嵌入式 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.run(Unknown Source)
at java.net.URLClassLoader.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 class 实际上在其中一个 Jar 文件中(准确地说是在 jersey-container-servlet-core.jar 中),但由于某种原因它被识别为 "unavailable"。这导致实际在引用的 Jar 文件中的 class 成为 "not found"!
任何人都可以告诉我是什么导致了这个 UnavailableException 以及(更重要的是)我如何防止它被抛出?
有人请指教...
ServletHolder holder = ctx.addServlet(
"org.glassfish.jersey.servlet.ServletContainer.class", "/*");
您正在为 class 名称使用字符串。这样做时,您不使用 .class
后缀。仅当您想要获取实际的 Class
对象时才这样做。你有两个选择
从字符串
中删除.class
ServletHolder holder = ctx.addServlet( "org.glassfish.jersey.servlet.ServletContainer", "/*");
删除
""
(双引号),只使用Class
对象 1。ServletHolder holder = ctx.addServlet( org.glassfish.jersey.servlet.ServletContainer.class, "/*");
1 - 请参见 addServlet(Class, String)