代码之家  ›  专栏  ›  技术社区  ›  lexicore

如何向spring配置的基于apache cxf的web服务客户机提供服务器地址?

  •  5
  • lexicore  · 技术社区  · 14 年前

    我正在尝试使用apache cxf,并且有一个关于客户机部分的问题。

    下面是我当前的一些 com.example.customerservice.service.CustomerService :

    <jaxws:client
        name="com.example.customerservice.service.CustomerServiceClient"
        serviceName="customer:CustomerServiceService" endpointName="customer:CustomerServiceEndpoint"
        address="http://localhost:8080/CustomerServicePort"
        serviceClass="com.example.customerservice.service.CustomerService">
        <jaxws:features>
            <bean class="org.apache.cxf.feature.LoggingFeature" />
        </jaxws:features>
    </jaxws:client>
    

    如你所见, address 属性是静态配置的。这不适合我,因为我事先不知道服务器的url。此外,在某些情况下,我希望将此客户端用于具有不同地址的不同服务。

    因此,spring中服务器地址的静态配置是不合适的。所以我的问题是-我怎样才能让它充满活力?

    • 目前我的解决方案是设置一个系统属性 baseUrl 并使用属性占位符配置器将其注入到spring配置中。
    • 另一种可能是简单地手工构建客户机,我也不太喜欢。

    但我相信我真的错过了什么。也许有可能 clientFactory.createClientFor("http://myserver:8080") ?

    1 回复  |  直到 9 年前
        1
  •  4
  •   Tristan    9 年前

    见帖子 CXF Users Mailing List .

    你有两个选择:

    1)如果您想保持spring上下文的原样并更改地址 运行时以编程方式:

    可以在请求上下文中设置标准属性。下面是一个例子 如何以编程方式执行此操作。

    bindingProvider BP=(bindingProvider)端口; map context=bp.getrequestcontext(); 对象olddress=context.get(bindingProvider.endpoint\u address\u属性); context.put(bindingProvider.endpoint_address_属性, 新地址);

    执行此操作时,应注意对客户端的多线程访问 代理。请参阅cxf常见问题解答(jax-ws客户端代理是否线程安全?)

    2)如果您愿意/能够提供wsdl url并使用jax-ws api,那么 可以编写将创建连接到终结点的客户端代理的可移植代码 你的选择。您可以使用“createdfromapi”(配置一个spring spring上下文文件中的client(选项1)属性仍然允许 以编程方式构建的客户端代理的基于spring的配置。 我认为这里也支持通配符,所以您应该能够 使用 春天的背景。如果端点 名称空间/本地名称在尝试的端点之间变化很大 与互动。

    3)以编程方式使用org.apache.cxf.jaxws.jaxwsproxyfactorybean,如图所示 在配置spring客户机的spring配置中(选项2)[2]。 这允许您设置接口和地址并创建新的客户端代理 实例随意。您甚至可能希望配置此的单个实例 大多数属性都已在春季设置的工厂,然后将其注入 您的代码,您可以在其中更改地址并构造新的客户端代理 随意(当然提供对工厂bean的同步访问)。 您还可以缓存客户机代理,以避免重新创建 他们一再重复。

    http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%253F http://cxf.apache.org/docs/jax-ws-configuration.html