-1

我正在尝试使用 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 的其他方式?

4

1 回答 1

0

恐怕您需要从外部配置地址,我认为 CXF 无法告诉 servlet 容器正在使用的端口。

于 2014-03-19T09:34:24.800 回答