如何在Apache CXF中显示WebService服务列表?
问题描述
我正尝试展示基于Apache CXF搭建的简单JAX-WS服务所提供的服务列表。
使用以下依赖:
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.5.2</version> </dependency>
服务类代码:
@WebService public class Foo { @WebMethod public String helloWorld() { return "hello"; } }
我通过以下代码发布服务:
Endpoint.publish("http://0.0.0.0:1234/foo", new Foo());
之后可以访问http://127.0.0.1:1234/foo?wsdl查看WSDL,但尝试访问/services路径(根据CXF文档,默认会创建包含可用端点列表的/services页面)却没有效果。想知道是否有办法启用该功能,且能否通过编程方式实现(不使用XML文件)?
解决方案
问题出在你使用的是JDK原生的Endpoint.publish()方法发布服务,这并不会触发CXF的扩展功能(包括/services服务列表页面)。要启用该功能,必须使用CXF自身的API来发布服务,以下是具体实现步骤:
1. 使用CXF的JaxWsServerFactoryBean发布服务
替换原有的发布代码,改用CXF提供的JaxWsServerFactoryBean创建并发布服务,同时启动CXF内置的Jetty服务器,这样会自动注册服务列表的Servlet。
示例代码:
import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory; public class ServicePublisher { public static void main(String[] args) { // 配置JAX-WS服务 JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); factory.setServiceClass(Foo.class); factory.setAddress("/foo"); // 创建并发布服务 factory.create(); // 启动Jetty服务器,监听指定端口 JettyHTTPServerEngineFactory engineFactory = new JettyHTTPServerEngineFactory(); engineFactory.createJettyHTTPServerEngine("0.0.0.0", 1234); System.out.println("服务已启动,访问http://127.0.0.1:1234/services查看服务列表"); } }
2. 验证效果
启动上述代码后,访问http://127.0.0.1:1234/services即可看到包含所有已发布服务的HTML列表页面,点击对应服务的链接还能直接查看WSDL。
原理说明
CXF的/services页面由其内置的CXFServlet负责处理,当使用CXF原生API发布服务时,会自动注册该Servlet并关联服务列表展示逻辑。而JDK原生的Endpoint.publish()是独立于CXF的实现,不会加载这些扩展组件,因此无法启用服务列表功能。
内容的提问来源于stack exchange,提问作者Alexa
相关产品推荐
相关产品推荐

