CXF web service deployed with docker compose won't work

40 Views Asked by At

After several years of using spring/spring boot/spring cloud. I've decided to learn from basic the Jakarta EE

I have CXF basic JAXRS web service with dummy api that work locally via CLI

(java -jar my-app.jar)

However, once I deploy it with docker-compose request isn't executed (failed)

the API request is: http://localhost:333/hello/persons should returns:

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

but one I do docker-compose up on the bottom docker-compose-yml file request is failed

This is the 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>

this is the main function & class:

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();
    }
}

This is the dummy 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"));
    }
}

dockerfile:

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"]

compose file

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
1

There are 1 best solutions below

0
Shay Zambrovski On

Found the issues

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