使用 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)。

*** 上的另一个类似问题。

【讨论】:

谢谢,但是我应该把 ... 代码部分放在哪里?在哪个文件中? 使用 Maven 时,依赖关系在 pom.xml 文件中描述。如果您不使用 Maven,您可以使用链接的 servlet.jar 库来编译项目,但要确保它与应用程序服务器使用的版本相同,并确保它不在生成的 war 文件中(或WEB-INF/lib) 部署时。【参考方案4】:

我重复了您的示例,它在我的机器上开箱即用。我下载了jersey-archive-1.14.zip并将包含的lib目录的全部内容放入WEB-INF/lib,而不是像你做的那样只有Jerseyjsr311-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 ...
.
【参考方案6】:

可能是您缺少 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项目为啥默认显示module

Eclipse 创建 Java 包---Eclipse教程第09课

如何使用eclipse软件创建一个Java项目?

Eclipse 创建 Java 包

Maven Eclipse使用Maven创建Java Web 项目

Eclipse 创建 Java 接口---Eclipse教程第11课