You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Testcontainers JAX-RS集成测试异常,请求技术排查指导

JAX-RS应用在Payara Micro/TomEE/Payara服务器部署出现404问题

我近期正在开发一个JAX-RS小型应用以熟悉相关技术,同时尝试使用Testcontainers编写集成测试。该应用部署在Tomcat容器中本地测试正常,但使用Payara Micro容器执行测试时出现404错误。我尝试过将应用部署到TomEE和Payara服务器,也均未成功。以下是相关配置代码、测试代码及错误日志,恳请有相关经验的人士提供指导:

Dockerfile

FROM tomcat:9-jdk11-openjdk

RUN rm -rf /usr/local/tomcat/webapps/ROOT

COPY target/restapp.war /usr/local/tomcat/webapps/ROOT.war

EXPOSE 8080

CMD ["catalina.sh", "run"]

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                             https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

    <servlet>
        <servlet-name>API Root</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.jchaaban</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>API Root</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

JAX-RS路由代码

package com.jchaaban.javaeerestapp;


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

@Path("/greet")
public class SpeakerApplication extends Application {
    @GET
    @Path("/hello")
    @Produces(MediaType.APPLICATION_JSON)
    public String sayHello() {
        return "Hello";
    }

}

集成测试代码

package com.jchaaban.javaeerestapp.service.persistence.todo;

import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
import org.testcontainers.utility.MountableFile;

import java.nio.file.Paths;

import static io.restassured.RestAssured.given;
@Testcontainers
public class BasicApplicationIT {

    private static final MountableFile warFile = MountableFile.forHostPath(
            Paths.get("target/rest-app.war").toAbsolutePath(), 511);
    @Container
    private static final GenericContainer microContainer =
            new GenericContainer(DockerImageName.parse("payara/micro:5.2022.2-jdk11"))
                    .withExposedPorts(8080)
                    .withCopyFileToContainer(warFile, "/opt/payara/deployments/app.war")
                    .waitingFor(Wait.forLogMessage(".* Payara Micro .* ready in .*\\s", 1))
                    .withCommand("--deploy /opt/payara/deployments/app.war --noCluster --contextRoot /");

    @Test
    public void checkContainerIsRunning(){
        String host = microContainer.getHost();
        Integer port = microContainer.getMappedPort(8080);

        // Construct the correct URL using the host and dynamic port
        String url = "http://" + host + ":" + port + "/api/greet/hello";

        // Perform the test
        given()
                .log().all() // Log the request details
                .contentType(ContentType.JSON)
                .when()
                .get(url)
                .then()
                .log().ifValidationFails()
                .log().body()
                .assertThat()
                .statusCode(200);
    }
}

错误日志

Request method: GET
Request URI:    http://localhost:55244/api/speakers/get
Proxy:          <none>
Request params: <none>
Query params:   <none>
Form params:    <none>
Path params:    <none>
Headers:        Accept=*/*
                Content-Type=application/json
Cookies:        <none>
Multiparts:     <none>
Body:           <none>
<html>
  <head>
    <title>Payara Micro  5.2022.2 #badassmicrofish- Error report</title>
    <style type="text/css">&lt;!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;}  B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P{font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}HR {color : #525D76;}--&gt;</style>
  </head>
  <body>
    <h1>HTTP Status 404 - </h1>
    <hr/>
    <p>
      <b>type</b>
 Status report     </p>
    <p>
      <b>message </b>
    </p>
    <p>
      <b>description </b>
The requested resource is not available.    </p>
    <hr/>
    <h3>Payara Micro  5.2022.2 #badassmicrofish</h3>
  </body>
</html>
HTTP/1.1 404 Not Found
Server: Payara Micro #badassfish
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 1060
X-Frame-Options: SAMEORIGIN

<html>
  <head>
    <title>Payara Micro  5.2022.2 #badassmicrofish- Error report</title>
    <style type="text/css">&lt;!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;}  B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P{font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}HR {color : #525D76;}--&gt;</style>
  </head>
  <body>
    <h1>HTTP Status 404 - </h1>
    <hr/>
    <p>
      <b>type</b>
 Status report     </p>
    <p>
      <b>message </b>
    </p>
    <p>
      <b>description </b>
The requested resource is not available.    </p>
    <hr/>
    <h3>Payara Micro  5.2022.2 #badassmicrofish</h3>
  </body>
</html>

java.lang.AssertionError: 1 expectation failed.
Expected status code <200> but was <404>.

内容的提问来源于stack exchange,提问作者Hadi Rifaii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:22:01