在 Eclipse 中的 Tomcat 7 上运行 Jersey Web 应用程序时出现 404 错误

404 error when running Jersey web app on Tomcat 7 in Eclipse

提问人:knightcool 提问时间:5/2/2016 最后编辑:Communityknightcool 更新时间:10/4/2020 访问量:3582

问:

尝试使用 Jersey 创建一个简单的 RESTful Web 服务并将其部署在 Tomcat 7 上。由于我是 Java Web 应用程序开发的新手,并且渴望学习它,因此我将遵循本教程

我在 Eclipse 中创建了这个应用程序作为 Maven 项目,并使用了带有 groupID 的工件版本。请注意,我稍后必须更改 Project Facet,否则它不会为我提供将其部署到本地 Tomcat 服务器的选项。jersey-quickstart-webapp2.22.2org.glassfish.jersey.archetypesDynamic Web Module

我已将我的应用程序添加为 Tomcat 服务器中的资源。当我在Eclipse中启动Tomcat服务器时,我没有看到任何错误。只有一个 警告 ,根据许多 SO 帖子,可以安全地忽略它。messengerWARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:messenger' did not find a matching property.

右键单击应用程序并单击 -> 后,我看到未找到 URL 的 404 页面以及 .Run AsRun on Serverhttp://localhost:8080/messenger/http://localhost:8080/webapi/myresource

检查了很多类似的 SO 帖子,比如这个和这个,但它们没有帮助。

我注意到的一件事是内部与我的应用程序的 web.xml 不匹配(不确定它是否应该匹配,在应用程序部署到 Tomcat 后)。事实上,该目录下的内容复制如下:web.xml<peoject_root>/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ROOT/WEB-INF

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

需要一些关于可能出问题的指示。这可能是一些简单的事情,但我花了很多时间挠头,第 n 次出现相同的 404 错误。我希望在我获得一些信心并继续观看培训视频之前,让这个简单的应用程序工作。

通过屏幕截图和文件内容添加更多细节:

MyResource.java

package org.testapp.java.messenger;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class MyResource {

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return "Got it!";
    }
}

网络.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.testapp.java.messenger</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
</web-app>

项目结构

enter image description here

Tomcat 错误

enter image description here

您在代码中看到的一个红叉实际上是教程视频中的讲师要求忽略的,因为 Tomcat 提供了 HTTPServlet 类。The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

控制台输出

May 01, 2016 10:09:20 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:messenger' did not find a matching property.
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version:        Apache Tomcat/7.0.69
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Apr 11 2016 07:57:09 UTC
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         7.0.69.0
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Mac OS X
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            10.10.2
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          x86_64
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.8.0_31-b13
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         /Users/abc/Personal/Java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         /Users/abc/Personal/Java/apache-tomcat-7.0.69
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=/Users/abc/Personal/Java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=/Users/abc/Personal/Java/apache-tomcat-7.0.69
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=/Users/abc/Personal/Java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=/Users/abc/Personal/Java/apache-tomcat-7.0.69/endorsed
May 01, 2016 10:09:20 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=UTF-8
May 01, 2016 10:09:20 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /Users/abc/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
May 01, 2016 10:09:20 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
May 01, 2016 10:09:20 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
May 01, 2016 10:09:20 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 434 ms
May 01, 2016 10:09:20 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
May 01, 2016 10:09:20 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.69
May 01, 2016 10:09:20 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
May 01, 2016 10:09:20 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
May 01, 2016 10:09:20 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 269 ms

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.testapp.java</groupId>
    <artifactId>messenger</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>messenger</name>

    <build>
        <finalName>messenger</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.glassfish.jersey</groupId>
                <artifactId>jersey-bom</artifactId>
                <version>${jersey.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
        </dependency>
        <!-- uncomment this to get JSON support
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
        </dependency>
        -->
    </dependencies>
    <properties>
        <jersey.version>2.22.2</jersey.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>
Java Eclipse Rest Maven Tomcat

评论

0赞 Clement Amarnath 5/2/2016
在面对这个问题时,您能否发布控制台输出。这将有助于缩小问题范围。
0赞 knightcool 5/2/2016
@ClementAmarnath 感谢您对此进行调查!我已经用控制台输出更新了帖子。
0赞 Clement Amarnath 5/2/2016
这是服务器启动,在点击服务时,您在控制台中不会出现任何异常!!
1赞 redoc 5/2/2016
您尝试过localhost:8080 / messenger / webapi / myresource吗?
0赞 knightcool 5/2/2016
@ClementAmarnath 是的,点击服务时没有例外。可能是什么原因?

答:

1赞 Clement Amarnath 5/2/2016 #1

在 web.xml 中的 servlet 条目之前添加以下行<display-name>messenger</display-name>

现在尝试您的服务 http://localhost:8080/messenger/myresource

评论

0赞 knightcool 5/3/2016
也试过了!没用。我猜“战争”本身没有正确部署到 tomcat。有没有办法证实这个假设?我应该在 tomcat 日志中寻找特定的东西等等?
-1赞 knightcool 5/3/2016 #2

更新:

我尝试在 Jetty 上部署我的应用程序,方法是将以下插件添加到我在 pom.xml 中的构建部分。

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>6.1.10</version>
</plugin>

然后从终端运行。现在,我可以在 上成功访问我的 Web 应用程序。它按预期返回。mvn jetty:runhttp://localhost:8080/messenger/webapi/myresourceGot it!

因此,在我将其部署到 tomcat 的方式中,这绝对是一个问题。如果有人有一些指示,我有兴趣进一步调试 tomcat 问题。

1赞 anuvab-b 8/5/2020 #3

在遵循该教程时,我也遇到了同样的问题,尝试了几件事,但它不起作用。 最后,当我将版本降级到 2.6(部分试错)时,它显示“知道了”文本作为响应。我最初为泽西岛原型选择了最新版本 3.0.0-M6。

评论

0赞 erfelipe 10/28/2020
就是这样。谢谢@anuvab-b
7赞 Priyanka Kanodia 10/4/2020 #4

我遇到了类似的问题,并意识到 Jersey 版本 3.0.0-M6 和 Tomcat 9 不兼容。

原因 --> Tomcat 9 使用 javax.servlet.Filter。Jersey 3.x 是 Jakarta EE 9 的一部分,依赖于基于 jakarta 的 API 包。jakarta.servlet.Filter 在 Tomcat 10 中可用。

解决方案--> 下载Tomcat 10并使用它。或将 Jersey 版本 2.X 与 Tomcat 9 或更低版本一起使用。

我个人将 Jersey 2.16 与 Tomcat 9 一起使用,它对我有用。

评论

0赞 kAmol 9/24/2021
最奇怪的部分是,正如许多 SO 答案所建议的那样,我尝试了 2.35,但仍然面临同样的问题。最后,我删除了服务器配置和项目,并按照您的建议创建了 2.16+tomcat 9,它工作了