使用Java,Eclipse的RESTful Web服务创建教程。 Apache Tomcat,无法正常工作

我想在我的电脑上创建并运行一个简单的RESTful应用程序。 我在Microsoft Windows Xp操作系统上使用Eclipse Helios IDE上的Java编程语言和Apache Tomcat 7服务器。

我一直试图在我的电脑上复制本教程的相同程序(从3到3.4步) ,但它不起作用。

这是我做的:

  • 使用Apache Tomcat 7设置在Eclipse上创建了一个Dynamic项目

  • 将我的Jersey和jsr311-api-1.0 jar文件放入项目\WEB-INF\lib\目录中

  • 将代码部分从网页复制到我的项目中

  • 右键单击该项目,单击“运行方式 – >在服务器上运行”

  • 试图到达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\OpenVPN\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 

也许有些课程失踪了?

要解决您的问题,不使用Maven,您需要将JAX-RS facet添加到您的项目中。 这里发生的是Eclipse没有将正确的lib部署到服务器 。 可以通过项目的Properties |访问此配置 项目的方面。

说实话,我不知道要添加哪些特定的jar子来使Jersey工作,因为我使用Maven来管理依赖。 因此,我已经下载了Jersey软件包 ,并使用它配置了JAX-RS方面,而不是zip文件。 这可以在项目的属性|中看到 部署程序集,其中Jersey的libs已配置为已部署。 顺便提一下,您可以手动将已部署的库设置为服务器。

但后来我想起了为什么我使用Maven来管理依赖项。 该捆绑包不包含运行Jersey所需的所有内容。 它缺少asm jar(存在于zip文件中)。 所以我不得不将它添加到项目构建路径,并手动重新配置部署组件….

所以,这是Maven,Jersey和Eclipse的教程 。 试试吧,得出你的结论:)

我通过相同的教程开发了我的第一个RESTFUL服务。 一开始我也有几次404错误所以我不断改变一些事情,最后它对我有用。 这就是我所做的 –

1)从URL-Pattern选项卡中删除其余部分; 我认为这是错误的。 2)使用URL中的上下文根而不是包名。

我的url是"http://mylocalhost:8080/contextroot/classname ,它在@path注释中定义。

希望能帮助到你。

servlet.jar不应该出现在生成的war文件中(或者在WEB-INF / lib中)。 它应该由应用程序服务器本身提供。 (请参阅Tomcat的常见问题解答 )如果您使用Maven构建项目,则可以按provided servlet api的范围( 链接 )。

StackOverflow上的另一个类似问题。

我重复了你的例子,它在我的机器上开箱即用。 我下载了jersey-archive-1.14.zip并将包含的lib目录的全部内容放入WEB-INF / lib,而不仅仅是Jerseyjsr311-api-1.0 jar

这些jar子是:

  • ASM-3.1.jar
  • jackson核心ASL-1.9.2.jar
  • jacksonJAXRS-1.9.2.jar
  • jackson映射器-ASL-1.9.2.jar
  • jackson-XC-1.9.2.jar
  • 新泽西州的客户 – 1.14.jar
  • 新泽西州的核心1.14.jar
  • 新泽西州JSON-1.14.jar
  • 新泽西服务器1.14.jar
  • 新泽西州的servlet-1.14.jar
  • 抛放-1.1.jar
  • JSR311的API-1.1.1.jar

其中一些可能是不必要的,你可以尝试减少它们。 但从所有这些开始。

但错误信息很奇怪。 它说缺少javax.servlet.Filter ,它应该存在于/lib/servlet-api.jar 。 运行tomcat时,此文件始终位于类路径中。

您需要从WEB-INF / lib目录中删除servlet.jar或包含javax.servlet.Filter的任何其他jar。

虽然您需要在编译类路径上使用类javax.servlet.Filter以便编译示例代码,但您需要确保不在Web应用程序中包含此类。 从Tomcat类加载器HOWTO:

当Tomcat启动时,它会创建一组类加载器,这些加载器被组织成以下父子关系,其中父类加载器位于子类加载器之上:

  Bootstrap | System | Common / \ 

Webapp1 Webapp2 …

基本上,在Tomcat容器中配置的安全性可能无法正确找到webapp中的(可能)servlet.jar。

您可以通过打开详细类加载verbose:class来查看是否从奇怪的位置加载了javax.servlet.Filter。 搜索该类,如果它不是来自Tomcat库,则可能是您的问题。

可能是你缺少servlet-api.jar。 在/ WEB-INF / lib或类路径中添加最新的jar,看看它是否有效。

它似乎没有在类路径中找到servlet jersey jar。 确保包含它们。 我假设你在测试这个权利之前打包成战并部署。 因此,只需检查战争是否包含编译时应用程序可用的所有jar。

像之前的答案一样。 你错过了一些jar子。 您可以在Project> WebContent> WEB-INF> lib>文件夹中或在webserver的lib文件夹中添加这些jar文件(例如, \ apache-tomcat \ lib

如果您希望我们告诉您缺少什么样的jar,请尝试粘贴两个lib文件夹的列表或屏幕截图。

希望这可以帮助

据我所知,您正在Eclipse中运行Tomcat。 有可能你没有使用你的计算机中的安装目录(即你已经将JAR复制到的那个),但实际上是使用Eclipse在本地创建的临时副本(抱歉,我不在我的开发计算机上,所以无法查看详细信息)?

从记忆中你有2个选择:

  1. 您需要更改Eclipse用于Tomcat的(工作)目录,使其成为您实际拥有Tomcat文件的目录。

  2. 您需要使用Eclipse中的GUI界面将JAR添加到Eclipse中的Tomcat。

或者,我在这里可能完全错了;-)

编辑:包括我正在谈论的位的截图。

对于我上面的选择:

  1. 请参阅中间的“Sever Locations”,以便“控制tomcat安装”。
  2. 单击下图中“常规信息”框中的“打开启动配置”链接时,可以在类路径选项卡中添加它们

在此处输入图像描述

您应该添加所有在jersey 1.6存档中找到的jar,下载此存档并将所有jar添加到项目的WebContent / WEB-INF / lib文件夹中。

我有这个错误超过一天! 事实certificate,问题来自使用不同版本的泽西岛。 如果您使用我在下面提供的内容替换您的web.xml内容,那就没问题!

   Jersey REST Service org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages de.vogella.jersey.first   unit:WidgetPU persistence/widget  1   Jersey REST Service /rest/*  

希望我的答案能为那些决定遵循相同教程的其他人节省大量时间!

从WEB-INF / lib文件夹中删除servlet.jar。 Servlet.jar不应该在那里解决这个问题。

我也遇到了HTTP状态404问题,遵循相同的教程。

首先,我尝试使用Jersey库1.18和2.15在Eclipse中设置JAX-RS Project Facet,但它不起作用。

最后,我通过用上下文根(即eclipse项目名称)替换URL中的包名(de.vogella.jersey.first)来解决问题。

mkyong.com的这个教程给了我提示找到解决方案。 无论如何,我不知道URL中的包名是否肯定是一个错误,或者是否有一些配置细节可以使它工作。