2

我正在使用 Camel-CXF 从包中发布 Web 服务。我使用蓝图进行配置。我的理解是,这个CXF配置会在指定端口动态创建一个Jetty连接器,并在指定路径发布CXF servlet:

<cxf:cxfEndpoint id="myEndpoint" address="http://0.0.0.0:${endpoint.port}/${context}" serviceClass="...">
    <cxf:properties>
        <!-- ... -->
    </cxf:properties>
</cxf:cxfEndpoint>

这很好用。服务端点在指定的端口和路径上可用。

现在我想让原始的 WSDL 可用,由 Tomi Vanek 的wsdl-viewer样式表转换。我想出了如何使用 Pax Web 的 DefaultResourceMapping 使静态资源可用:

<bean id="resourceMapping" class="org.ops4j.pax.web.extender.whiteboard.runtime.DefaultResourceMapping">
    <property name="alias" value="/wsdl" />
    <property name="path" value="/wsdl/v4_0" />
</bean>

但是,这使得 WSDL 可以在端口 8181 中的默认 Jetty 连接器上访问。我不知道如何将资源映射器绑定到默认连接器以外的任何其他连接器。更具体地说,对于为 CXF 端点动态创建的连接器。

4

1 回答 1

2

您必须区分这两个连接器。首先,如果您以现在使用的方式使用 cxf,您还会运行一个特殊的 Jetty 实例,它会打开 cxf 使用的连接。通过您的资源映射,您正在使用 Pax-Web 提供的 OSGi HttpService,它本身使用 Jetty 作为底层服务器。这就是为什么两者都在不同的连接器上运行。要仅使用一个连接器,您需要确保 cxf 也使用 Pax-Web 作为底层服务器来为您的 Web 服务提供服务。

为此,请确保您的 cxf 端点没有连接器地址:

<cxf:cxfEndpoint id="myEndpoint" address="/${context}" serviceClass="...">

之后,您可以根据需要配置 pax-web 以使用任何其他端口。
对于使用与标准不同的端口。需要通过org.ops4j.pax.web.cfg文件移植配置。

org.osgi.service.http.port=9292

更改默认连接器的默认端口。对于不同的连接器,需要通过 Karaf 的 etc 文件夹中的 jetty.xml 添加这些额外的连接器。

<Call name="addConnector">
    <Arg>
        <New class="org.eclipse.jetty.server.ServerConnector">
            <Arg name="server">
                <Ref refid="Server" />
            </Arg>
            <Arg name="factories">
                <Array type="org.eclipse.jetty.server.ConnectionFactory">
                    <Item>
                        <New class="org.eclipse.jetty.server.HttpConnectionFactory">
                            <Arg name="config">
                                <Ref refid="httpConfig" />
                            </Arg>
                        </New>
                    </Item>
                </Array>
            </Arg>
            <Set name="host">
                <Property name="jetty.host" default="localhost" />
            </Set>
            <Set name="port">
                <Property name="jetty.port" default="8282" />
            </Set>
            <Set name="idleTimeout">
                <Property name="http.timeout" default="30000" />
            </Set>
            <Set name="name">jettyConn1</Set>
        </New>
    </Arg>
</Call>

在您的 Bundle 中,您需要设置以下内容以使用指定的连接器。

Web-Connectors: jettyConn1
Web-VirtualHosts: localhost

注意
,因为您使用的是 Apache Camel,所以这种方法对您不起作用,因为实际上处理此问题的包不是您自己的包,而是 camel/cxf 包。因此,这对您不起作用。

于 2016-01-01T09:07:42.920 回答