当前位置: 首页 > 知识库问答 >
问题:

未找到带有Eclipse和Payara服务器的Jersey REST应用程序的HTTP状态404

贺俊杰
2023-03-14

我正在尝试使用Payara服务器为Eclipse中的预订系统开发Jersey服务器应用程序。当我运行这个项目时,我会得到“HTTP状态404-未找到”。我查看了一些教程和StackOverflow帖子,但没有找到错误。有人能帮我吗?

BookingService界面:

public interface BookingService {

    public Response addBooking(Room room);

    public Response cancelBooking(Room room);

    public Room getRoom(int roomNumber);

    public Room[] getAllAvailableRooms();
}

BookingService实现:

@Path("/booking")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class BookingServiceImpl implements BookingService{

private static Map<Integer,Room> rooms = new HashMap<Integer,Room>();

@POST
@Path("/add")
public Response addBooking(Room room) {
    Response response = new Response();

    if(rooms.get(room.getNumber()).isBooked()) {
        response.setMessage("This room is not available");
        return response;
    }
    room.bookRoom();
    response.setMessage("Room successfully booked");

    return response;
}

@GET
@Path("/delete")
public Response cancelBooking(Room room) {
    Response response = new Response();
    if(!rooms.get(room.getNumber()).isBooked()) {
        response.setMessage("This room is not booked so booking cannot be cancelled");
        return response;
    }

    room.cancelBooking();
    response.setMessage("The booking for room " + room.getNumber() + "has been successfully cancelled");
    return null;
}

@GET
@Path("/getAll")
public Room[] getAllAvailableRooms() {
    Set<Integer> keys = rooms.keySet();
    Room[] roomArray = new Room[keys.size()];
    int i=0;
    for(Integer key : keys){
        if (!rooms.get(key).isBooked()) {
            roomArray[i] = rooms.get(key);
            i++;
        }
    }
    return roomArray;
}

波姆。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>se.kth.id1212</groupId>
<artifactId>ID1212BookingSystem</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ID1212BookingSystem Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.20</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.20</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.13</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-common</artifactId>
        <version>2.22.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <finalName>ID1212BookingSystem</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

编辑:当我研究这个问题时,我在网上读到。使用jersey 2时,xml文件不必指定除显示名称以外的任何内容。我不知道这是不是真的,但下面是网络。我在阅读之前使用的xml文件,但它也不起作用。

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <!-- Jersey Servlet configurations -->
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>se.kth.id1212.ID1212BookingSystem</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <!-- Jersey Servlet configurations -->
</web-app>

编辑2,添加以下图像:

共有2个答案

郑西岭
2023-03-14

应用程序似乎没有定义侦听根URL的RESTendpoint。如果你的应用程序运行在URL上,比如http://localhost/myapp然后,对该URL获得HTTP 404响应是完全正常的。您只能从绑定到某些REST方法的URL获得有效响应。

因为BookingServiceImpl绑定到/预订并且它的所有方法都绑定到像/add或/getAll这样的子路径,所以您可以通过组合来访问REST方法

  • 应用程序上下文根,例如“myapp”(我不知道这一点)
  • JAX-RS应用程序根路径,即web中定义的“/*”。xml,这意味着它是空的
  • BookingServiceImplpath,即“/booking”
  • BookingServiceImpl方法上的路径,例如getAllAvailableRooms

因此,要调用getAll可用性方法,您应该使用像http://localhost/myapp/booking/getAll这样的URL,而不仅仅是http://localhost/myapp.

在最近的Payara服务器版本中,当您转到应用程序详细信息并单击底部“模块和组件”表中的“查看endpoint”时,您应该能够在web管理控制台中查看所有可用的URL,请参见最后的屏幕截图。

附加说明:

我建议在扩展javax的单独类中定义JAX-RS应用程序。ws。rs.Application并接受带有servlet映射的@ApplicationPath注释。那么你就不需要在你的网络上做任何事情了。你甚至可以删除它。这是相当于web的Java代码。xml(是的,就是这么简单,所有其他代码都是可选的):

@ApplicationPath("/")  // maps the servlet to "/*"
public class MyRESTApplication extends Application {
}

我还建议观看一段关于在Netbeans中使用Payara创建REST服务的简短视频(在Eclipse中应该非常类似,IDE没有太多相关性)。你可以跳过介绍,从3:30开始。

Payara管理控制台中的RESTendpoint详细信息

袁山
2023-03-14

甚至,你最新的网站。xml有一个问题,您需要放慢速度,将每个更改与教程进行比较。根据上述教程

你应该在你的网站上有以下init参数。xml

<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>se.kth.id1212.ID1212BookingSystem</param-value>
</init-param>

但是,你却写了

<init-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value>se.kth.id1212.ID1212BookingSystem</param-value>
</init-param>

另外,只是为了补充说明,/add需要POST,这意味着它将在其主体中需要请求数据。我建议使用一些REST客户端,可能是测试的邮递员。

==更新了==

我真的不明白,你为什么在网站上使用下面的包名。xml????

<param-value>se.kth.id1212.ID1212BookingSystem</param-value>

我很确定,在某个地方,你没有犯错误,BookingServiceImpl的包应该是server。服务notse。kth。id1212。ID1212预订系统。因此,在param value中,您应该提供相同的包名,而不是随机的包名。。所以,应该是这样

 <param-value>server.service</param-value>

另外,我明白了,您已经在类上使用了产生/消耗注释,而应该是在每个方法上

 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
 public class BookingServiceImpl implements BookingService{

这是我谦卑的要求,不要把你的知识和可用的教程混在一起。首先试着理解实现,精确地遵循任何可用的教程(可能只是复制/粘贴)。选择最简单的教程可能只是打印Hello World

 类似资料:
  • 这是一个启动应用程序。它运行完美,但没有得到输出(它显示我的HTTP状态404错误在浏览器) 波姆。xml 启动类Main方法 控制器在主类后加载 网址:http://localhost:8080/hello输出

  • 这个问题听起来可能重复,但事实是,我还没有收到解决方案。我刚刚进入struts2,正在尝试一个登录应用程序。我附上了以下图书馆: 当我单独运行正常的JSP页面(没有struts标记)时,它运行正常。但每当我单独运行带有struts标记的jsp页面时,它都会显示。在创建整个网络之后。xml和struts。xml并运行它报告的整个应用程序。我知道问题是我的jsp页面没有被识别。请帮忙。 网状物xml:

  • 我使用ESAPI jar进行验证。当我调用isValidInput(Context,input.trim(),ValidateConstant时。APLHA_NUMERIC_TYPE,最大长度,真);或isValidInput(上下文,输入,ValidateConstant.NUMERIC_TYPE,maxLength,true);并且输入错误,带有单独的字符。然后它抛出一些像 当我单独执行程序时

  • 我想创建一个Spring MVC项目。当我在tomcat localhost上使用运行配置(http://localhost:8080/springmvc/hello或http://localhost:8080/springmvc或http://localhost:8080/hello)运行项目时,我得到了以下错误: HTTP状态404-未找到 类型状态报告 消息请求的资源[/SpringMVC]

  • 我试图使一个API工作在springstart但是当我输入请求:http://localhost:8080/employee/all我得到这个结果: 它是一个经典的服务,包含一个模型、一个服务、一个存储库、一个映射器和一个异常(如果没有员工),使用的数据库是sql中的实体,如下所示 服务: 仓库 模型 制图员 例外 波姆。xml

  • 我不确定如何处理这个问题,http响应状态取决于我需要阅读的主体。我有这样的想法: 但为了获得阅读正文所需的状态,我看不到任何使用发布者提供的值的选项。我如何使其能够调用上面的方法,并在创建NetYoutBound时使用该状态