使用 docker compose 部署的 CXF Web 服务将无法工作

问题描述 投票:0回答:1

使用 spring/spring boot/spring cloud 几年后。我决定从基础开始学习 Jakarta EE

我有 CXF 基本 JAXRS Web 服务,带有虚拟 api,可以通过 CLI 在本地工作

(

java -jar my-app.jar
)

但是,一旦我使用 docker-compose 部署它,请求就不会执行(失败)

API 请求是:

http://localhost:333/hello/persons
应返回:

[{"id":1,"name":"A"},{"id":1,"name":"B"}]

但是我在底部执行 docker-compose up docker-compose-yml 文件请求失败了

这是pom.xml:

<?xml version="1.0" encoding="UTF-8"?><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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>cxf-jetty</artifactId>
<verson>1.0-SNAPSHOT</version>

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <apache.cxf.version>4.0.3</apache.cxf.version>
    <jackson.version>2.16.0</jackson.version>
    <jakarta-jws.version>3.0.0</jakarta-jws.version>
    <jakarta-platform.version>9.0.0</jakarta-platform.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        <version>${apache.cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>${apache.cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-extension-providers</artifactId>
        <version>${apache.cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jakarta.rs</groupId>
        <artifactId>jackson-jakarta-rs-json-provider</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>jakarta.ws.rs</groupId>
        <artifactId>jakarta.ws.rs-api</artifactId>
        <version>3.1.0</version>
    </dependency>


</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <configuration>
                <createDependencyReducedPom>true</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation=
                                                 "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>org.example.WebServer</mainClass>
                            </transformer>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/cxf/bus-extensions.txt</resource>
                            </transformer>
                        </transformers>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <finalName>my-app</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这是主要功能和类:

package org.example;

import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;

import java.util.logging.Logger;

public class WebServer {

    private static final Logger logger = Logger.getLogger(WebServer.class.getName());

    public static void main(String[] args) throws InterruptedException {
        logger.info("Starting server...");
        JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
        factoryBean.setResourceClasses(SimpleController.class);
        factoryBean.setProvider(new JacksonJsonProvider());
        factoryBean.setAddress("http://localhost:333/");
        Server server = factoryBean.create();
        server.start();
        Thread.currentThread().join();
    }
}

这是虚拟 API

@Path("hello")
public class SimpleController {

    @GET
    @Path("persons")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Person> getPersons() {
        return List.of(new Person(1, "A"), new Person(1, "B"));
    }
}

docker文件:

FROM alpine:edge
RUN apk add --no-cache openjdk17
RUN apk --no-cache add curl
EXPOSE 333
COPY target/my-app.jar /app/my-app.jar
WORKDIR /app
ENTRYPOINT ["java","-jar","my-app.jar"]

撰写文件

version: "3.9"
services:
  my-app:
    restart: always
    container_name: my-app
    build: my-app
    ports:
      - "333:333"
    networks:
      - app-network

networks:
  app-network:
    external: false
    name: app-network
java docker docker-compose jakarta-ee cxf
1个回答
0
投票

发现问题

factoryBean.setAddress("http://localhost:333/");
-->
factoryBean.setAddress("http://0.0.0.0:333/");

© www.soinside.com 2019 - 2024. All rights reserved.