2

我必须联系 Web 服务 (WS)。我正在使用 JDK 1.6、maven 3.04、Spring 3.20 和 apache 的 CXF 2.7.2。使用 maven,我通过提供 wsdl 文件为 WS 创建了存根。我有一个用于 WS 客户端的 spring 配置,它看起来像

servlet-context.xml

<jaxws:client id="paymentClient" serviceClass="com.xxx.payment.Payment"
    address="http://127.0.0:8088/mockPaymentBinding" <!-- SOAPUI mock -->
    username="username"
    password="secret" />
<!- username and password are for wsdl basic authentication -->

在 Java 代码中,它看起来像

@Autowired 
com.xxx.payment.Payment client;
..
// Set all needed parameters.
PaymentGetBalanceResponse response = null;
PaymentGetBalance getBalance = new PaymentGetBalance();
RequestGetBalance value = new RequestGetBalance();
value.setTransactionId("transActionId");
getBalance.setRequest(value );

// Now call the WS and get the response
response = client.getBalance(getBalance); // generated by the cxf -client argument.

“响应”行由 CXF 作为示例生成。然后 Eclipse 告诉我缺少某些东西(getbalance),并可以选择在线上方为我创建它。然后其他东西(价值)缺失等等。最后,所有参数都正确填写。所有缺少的东西/变量/对象都在生成的存根代码中。

这就像一个魅力,但地址是在 spring 配置中硬编码的 atm。应用程序的配置参数存储在一个简单的数据库中。使用 spring bean 可以访问内容,因此我可以使用 config.getValue(URL); 之类的东西在代码的最后获取变量;

我希望能够更改上面代码中的“地址”(url WS),但还没有找到方法。在生成的存根代码中找不到设置器。另一种方法是在 spring servlet-context.xml 文件中使用变量,但这些变量必须来自数据库。第二种选择。我可能/希望从底部开始并使用 Objectfactorys(在存根中)来创建对象。然后设置正确的参数(在“新”或设置器中),然后按我的方式到达顶部。一位同事已经这样做了(不是为了“地址”),这似乎可行,但代码充其量是次优/“混乱”。我还希望能够配置用户名和密码,而不是静态的。在 CXF 网站上做了很多 RTM,但无济于事。

阅读有关 JaxWsProxyFactoryBean 的一些内容,但由于我使用 Springs @autowire 功能,所以不知道如何在此处应用它。

我一直在为这个问题绞尽脑汁,但似乎我的神经元在转圈。任何帮助/指针都非常感谢。

4

1 回答 1

1

来自 CXF 用户指南:如何覆盖服务地址?.

如果我正确推断了弹簧配置,我认为这会:

   @Autowired
   com.xxx.payment.Payment client;
   // ... 
   BindingProvider provider = (BindingProvider)client.getServicePort();
   // You can set the address per request here
   provider.getRequestContext().put(
        BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
        "http://my/new/url/to/the/service");
于 2013-01-28T18:51:20.713 回答