使用Docker Compose部署CXF Web Service失败求助
Docker部署CXF JAXRS服务失败排查方案
本地通过java -jar my-app.jar运行CXF JAXRS Web Service正常,请求http://localhost:333/hello/persons能返回预期JSON:
[{"id":1,"name":"A"},{"id":1,"name":"B"}]
但使用docker-compose部署后请求失败,以下是核心问题排查及修复方案:
1. 服务监听地址限制(核心问题)
在WebServer类中,服务绑定的地址为http://localhost:333/:
factoryBean.setAddress("http://localhost:333/");
Docker容器内的localhost仅指向容器自身回环接口,外部主机无法通过端口映射访问该地址。需修改为监听所有网卡:
factoryBean.setAddress("http://0.0.0.0:333/");
修改后服务会绑定容器内所有可用网卡,外部可通过localhost:333正常访问。
2. POM文件拼写错误
pom.xml中<verson>标签拼写错误,应为<version>:
<!-- 错误写法 --> <verson>1.0-SNAPSHOT</version> <!-- 修正后 --> <version>1.0-SNAPSHOT</version>
该错误可能导致Maven构建异常,建议修正以避免后续问题。
3. 确认Person类序列化支持
确保Person类提供id和name的getter方法,Jackson JSON序列化依赖getter读取属性:
public class Person { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } // 必须添加getter方法 public int getId() { return id; } public String getName() { return name; } }
缺少getter可能导致容器环境下序列化失败。
4. 容器内服务状态验证
部署后可进入容器验证服务状态:
- 容器内请求测试:
docker exec -it my-app curl http://localhost:333/hello/persons
- 查看服务启动日志:
docker logs my-app
若容器内请求正常,说明外部网络配置无问题;若失败,根据日志定位启动报错(如类缺失、端口占用等)。
内容的提问来源于stack exchange,提问作者Shay Zambrovski
相关产品推荐
相关产品推荐

