我正在尝试使用 CXF WS-Discovery 插件发布 CXF 服务的 URL。
教程https://cxf.apache.org/docs/writing-a-service-with-spring.html帮助我构建了一个 helloworld 服务。WS-Discovery 的 CXF 文档https://cxf.apache.org/docs/ws-discovery.html说明添加 cxf-services-ws-discovery-service.jar 允许发布它。
很好,但是发布的 url 是相对于 servlet 的,因此无法从发送 WS-Discovery Probe 的客户端访问。
我发现了一个有趣的方法http://osdir.com/ml/users-cxf-apache/2012-05/msg00524.html建议使用以下 web.xml 和 cxf-servlet.xml 文件:
网页.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app.xsd">
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/webservices/*</url-pattern>
</servlet-mapping>
</web-app>
cxf-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<bean id="localhost" class="java.net.InetAddress" factory-method="getLocalHost" />
<bean id="publishedWebServiceUrl" class="java.lang.String">
<constructor-arg value="#{'http://' + localhost.hostAddress + ':8080' + servletContext.contextPath + '/webservices/hello_world'}"/>
</bean>
<jaxws:endpoint id="hello_world" implementor="HelloWorldImpl" address="/hello_world">
<jaxws:properties>
<entry key="publishedEndpointUrl" ><ref bean="publishedWebServiceUrl" /></entry>
</jaxws:properties>
</jaxws:endpoint>
</beans>
如果 servlet 容器使用端口 8080,这可以正常工作。
我尝试使用servletContext.getRealPath('/webservices')
,但这给出了文件系统路径而不是 http 地址。
有没有办法获取 servlet 容器端口(符合 tomcat、jetty、...)?或发布可导出 URL 的其他方式?