使用 Java、Eclipse 创建 RESTful Web 服务教程。 Apache Tomcat,不工作
Posted
技术标签:
【中文标题】使用 Java、Eclipse 创建 RESTful Web 服务教程。 Apache Tomcat,不工作【英文标题】:RESTful web service creation tutorial with Java, Eclipse. Apache Tomcat, not working 【发布时间】:2012-09-16 10:15:07 【问题描述】:我想在我的电脑上创建并运行一个简单的 RESTful 应用程序。 我在 Eclipse Helios IDE 上使用 Java 编程语言,在 Microsoft Windows Xp 操作系统上使用 Apache Tomcat 7 服务器。
我一直在尝试在我的电脑上复制 this tutorial (from 3 to 3.4 steps) 的相同过程,但它不起作用。
这就是我所做的:
在 Eclipse 上使用 Apache Tomcat 7 设置创建了一个动态项目
将我的 Jersey 和 jsr311-api-1.0 jar 文件放入项目\WEB-INF\lib\
目录
将网页中的代码部分复制到我的项目中
在项目上右击,点击“Run as -> Run on server”
试图联系http://localhost:8080/de.vogella.jersey.first/rest/hello
但我看到的是:
为什么它不起作用? 我做错了什么? 为什么?
非常感谢!
编辑:
控制台是这样说的:
25-set-2012 9.35.07 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Programmi\Java\jdk1.6.0_21\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Programmi/Java/jre6/bin/client;C:/Programmi/Java/jre6/bin;C:/Programmi/Java/jre6/lib/i386;C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\System32;C:\WINDOWS\;C:\WINDOWS\System32; C:\Programmi\R-Language\R-2.13.1\bin\;C:\Programmi\Open***\bin\; C:\Programmi\Java\jdk1.6.0_21\bin\; "C:\ApacheMaven\apache-maven-3.0.4\bin";;C:\Programmi\eclipseEC;
25-set-2012 9.35.08 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVVERTENZA: [SetPropertiesRule]Server/Service/Engine/Host/Context Setting property 'source' to 'org.eclipse.jst.jee.server:de.vogella.jersey.first' did not find a matching property.
25-set-2012 9.35.10 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.10 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.10 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 3459 ms
25-set-2012 9.35.10 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
25-set-2012 9.35.10 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.6
25-set-2012 9.35.11 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet Jersey REST Service as unavailable
25-set-2012 9.35.12 org.apache.catalina.core.StandardContext loadOnStartup
GRAVE: Servlet /de.vogella.jersey.first threw load() exception
java.lang.ClassNotFoundException: javax.servlet.Filter
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1488)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4741)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5062)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5057)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
25-set-2012 9.35.12 org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.12 org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.12 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1790 ms
也许缺少一些类?
【问题讨论】:
从您启动 web 应用程序时起,您的日志是否提供了任何信息?它的web.xml
说什么?
@DonalFellows 控制台中有一些消息,我已经编辑了问题+
这可能与***.com/questions/8856308/…有关
您是否也检查了vogella.com/code/de.vogella.jersey.first/WebContent/WEB-INF/… 关于 web.xml 文件的信息?您没有在问题中提到这一点,但 vogella 上的示例为您提供了此文件。
@pd40 类似,可惜没用...
【参考方案1】:
要解决您的问题,在不使用 Maven 的情况下,您需要将 JAX-RS facet 添加到您的项目中。这里发生的是 Eclipse 没有将正确的库部署到服务器。可以通过项目的 Properties | 访问此配置。项目的方面。
说实话,我不知道要添加哪些特定的 jar 才能使 Jersey 工作,因为我使用 Maven 来管理依赖项。因此,我下载了Jersey bundle,而不是zip 文件,并用它配置了JAX-RS 方面。可以在项目的 Properties | 上看到这个效果。部署程序集,其中 Jersey 的库已配置为部署。顺便说一句,您可以手动将部署的库设置到服务器。
但后来我想起了我为什么使用 Maven 来管理依赖项。该捆绑包不包含运行 Jersey 所需的一切。它缺少 asm jar(存在于 zip 文件中)。所以我不得不将它添加到项目构建路径中,并手动重新配置部署程序集....
所以,这是一个带有 Maven、Jersey 和 Eclipse 的 tutorial。试试看,得出你的结论:)
【讨论】:
【参考方案2】:我完成了相同的教程来开发我的第一个 RESTFUL 服务。一开始我也遇到了几次404错误,所以我一直在改变一些东西,最后它对我有用。这就是我所做的-
1) 从 URL-Pattern 选项卡中删除了其余部分;我认为那是错误的。 2) 在 URL 中使用上下文根而不是包名。
我的网址是"http://mylocalhost:8080/contextroot/classname
,在@path 注释中定义。
希望对你有帮助。
【讨论】:
【参考方案3】:servlet.jar 不应位于生成的 war 文件中(或 WEB-INF/lib 中)。它应该由应用程序服务器本身提供。 (参见 Tomcat 的FAQ)
如果您使用 Maven 构建项目,您可以将 servlet api 的范围设置为provided
(link)。
*** 上的另一个类似问题。
【讨论】:
谢谢,但是我应该把我重复了您的示例,它在我的机器上开箱即用。我下载了jersey-archive-1.14.zip并将包含的lib目录的全部内容放入WEB-INF/lib,而不是像你做的那样只有Jersey
和jsr311-api-1.0 jar
。
罐子是:
asm-3.1.jar jackson-core-asl-1.9.2.jar jackson-jaxrs-1.9.2.jar jackson-mapper-asl-1.9.2.jar jackson-xc-1.9.2.jar jersey-client-1.14.jar jersey-core-1.14.jar jersey-json-1.14.jar jersey-server-1.14.jar jersey-servlet-1.14.jar jettison-1.1.jar jsr311-api-1.1.1.jar其中一些可能是不必要的,您可以尝试减少它们。但从所有这些开始。
不过,错误消息很奇怪。它说javax.servlet.Filter
不见了,应该住在
<your tomcat dir>/lib/servlet-api.jar
。运行 tomcat 时,此文件始终位于类路径中。
【讨论】:
【参考方案5】:您需要从您的 WEB-INF/lib 目录中删除 servlet.jar 或任何其他包含 javax.servlet.Filter 的 jar。
虽然您需要在您的编译类路径中使用 javax.servlet.Filter 类才能编译示例代码,但您需要确保您的 webapp 中不包含此类。来自 Tomcat 类加载器 HOWTO:
当 Tomcat 启动时,它会创建一组类加载器,它们是 组织成以下父子关系,其中 父类加载器在子类加载器之上:
Bootstrap | System | Common / \
Webapp1 Webapp2 ...
基本上,webapp 中的(可能)servlet.jar 可能没有正确找到 Tomcat 容器中配置的安全性。
您可以通过打开详细类加载verbose:class
来查看是否正在从一个奇怪的位置加载 javax.servlet.Filter。搜索类,如果它不是来自 Tomcat 库,那可能是你的问题。
【讨论】:
谢谢,但我怎么能打开详细类verbose:class
?
是java命令行参数,使用java -class:verbose ... 可能是您缺少 servlet-api.jar。在 /WEB-INF/lib 或类路径中添加最新的 jar,看看它是否有效。
【讨论】:
AS应该提供servlet api。 没有。这是错误的。您的应用程序不应在 WEB-INF\lib 中包含 servlet-api.jar 例如,如果找到,Tomcat 将忽略它。 simplysimple.info/…【参考方案7】:似乎在类路径中找不到 servlet jersey jar。确保包括它们。我假设您在测试此权利之前将其打包成战争并进行部署。因此,只需检查战争是否包括在编译时可用于您的应用程序的所有 jar。
【讨论】:
【参考方案8】:就像之前提到的答案一样。你缺少一些罐子。您可以将这些 jar 文件添加到 Project>WebContent>WEB-INF>lib> 文件夹或网络服务器的 lib 文件夹(例如 \apache-tomcat\lib )
如果您希望我们告诉您缺少的确切 jar,请尝试粘贴两个 lib 文件夹的列表或屏幕截图。
希望对你有帮助
【讨论】:
在 \WebContent\WEB-INF>lib\ 我有:asm-3.1.jar,jersey-bundle-1.14.jar。在 \apache-tomcat-7.0.6\lib\ 我有:annotations-api.jar、catalina-ant.jar、catalina-ha.jar、catalina-tribes.jar、catalina.jar、ecj-3.6.jar、el -api.jar、jasper-el.jar、jasper.jar、jsp-api.jar、servlet-api.jar、tomcat-api.jar、tomcat-coyote.jar、tomcat-dbcp.jar、tomcat-i18n-es .jar、tomcat-i18n-fr.jar、tomcat-i18n-ja.jar、tomcat-util.jar。谢谢! @DavideChicco.it 那么,jsr311-api-1.0.jar 在哪里?你应该有它在 \WebContent\WEB-INF>lib\【参考方案9】:据我所知,您是在 Eclipse 中运行 Tomcat。有可能您没有使用计算机中的安装目录(即您将 JAR 复制到的目录),但实际上使用的是 Eclipse 在本地创建的临时副本(对不起,我不在我的开发计算机 atm 上,所以无法查看详情)?
根据记忆你有两个选择:
您需要将 Eclipse 用于 Tomcat 的(工作)目录更改为您实际拥有 Tomcat 文件的目录。
您需要使用 Eclipse 中的 GUI 界面将 JAR 添加到 Eclipse 中的 Tomcat。
或者,我在这里可能完全错了;-)
编辑:包括我正在谈论的部分的屏幕截图。
对于我上面的选项:
-
请参阅中间的“服务器位置”需要位于“控制 Tomcat 安装”的位置。
当您单击下图中“常规信息”框中的“打开启动配置”链接时,将它们添加到类路径选项卡中
【讨论】:
【参考方案10】:您应该添加在 jersey 1.6 存档中找到的所有 jar,下载 this 存档并将所有 jar 添加到项目的 WebContent/WEB-INF/lib 文件夹中。
【讨论】:
【参考方案11】:我有这个错误超过一天!事实证明,问题来自于不同版本的 Jersey 的使用。如果你用我在下面展示的内容替换你的 web.xml 内容,那就没问题了!
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>de.vogella.jersey.first</param-value>
</init-param>
<init-param>
<param-name>unit:WidgetPU</param-name>
<param-value>persistence/widget</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
希望我的回答能为同样决定遵循相同教程的其他人节省大量时间!
【讨论】:
【参考方案12】:从 WEB-INF/lib 文件夹中删除 servlet.jar。 Servlet.jar 不应该在那里,这为我解决了问题。
【讨论】:
【参考方案13】:按照相同的教程,我也遇到了 HTTP 状态 404 问题。
首先,我尝试使用 Jersey 库 1.18 和 2.15 在 Eclipse 中设置 JAX-RS Project Facet,但没有成功。
最后我通过将 URL 中的包名(de.vogella.jersey.first)替换为上下文根(即 eclipse 项目名称)解决了这个问题。
This tutorial mkyong.com 给了我寻找解决方案的提示。无论如何,我不知道 URL 中的包名称是否肯定是错误的,或者是否有一些配置细节可以使其正常工作。
【讨论】:
以上是关于使用 Java、Eclipse 创建 RESTful Web 服务教程。 Apache Tomcat,不工作的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse 创建 Java 包---Eclipse教程第09课