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"><!--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;}--></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"><!--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;}--></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
相关产品推荐
相关产品推荐

