动态端点的Apache CXF客户端

27

我现在使用Apache CXF作为一个Web服务客户端,用于绕过NTLM身份验证。它运行得很好,但我想知道为什么似乎无法设置Web服务的目标端点。CXF似乎希望在运行时获取WSDL,有些奇怪 - 不确定原因。它从WSDL中获取物理端点,这在测试环境中可以正常工作,但在部署时肯定会发生变化。

以下是一些演示代码:

        MyWebServices service = new MyWebServices ();
        MyWebServicesSoap port = service.getMyWebServicesSoap12();

        // Turn off chunking so that NTLM can occur
        Client client = ClientProxy.getClient(port);
        HTTPConduit http = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(36000);
        httpClientPolicy.setAllowChunking(false);
        http.setClient(httpClientPolicy);

        port.doSomethingUseful();

再次强调,我在CXF客户端API中找不到设置服务终端的地方。至少目前我没有看到。 在这种情况下,目标是http://localhost/integration/webservices/mywebservices.asmx,但可能会有其他位置。毫无疑问,这个平凡的问题肯定有解决办法吧?

3个回答

49

尝试以下方法:

MyWebServicesSoap port = service.getMyWebServicesSoap12();
BindingProvider provider = (BindingProvider) port;
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); 

或者,MyWebServices 可能有其他的 getXXX 方法,它们需要一个 WSDL 地址作为参数。


在MyServices类中,是否有其他方法可以返回接受URL参数的端口?您能否编辑您的帖子以粘贴该类的签名? - Kevin
4
看到CXF团队的做事方式总是让我对自己那些不必要的过度设计的代码感觉更好 :) - mhvelplund
1
...又回到这里了...寻找相同的GD*信息。不幸的是,我只能给一次积分 :) - mhvelplund
“endpoint” 是什么类型的对象?是包含 URL 的字符串吗?还是特殊的 EndPoint(或类似的类)实例? - Jakob Jenkov
从另一个示例端点来看,它似乎是一个简单的字符串,包含了新端点的URL。 - David Bradley

13

我在使用cxf 2.6.1

Client client = ClientProxy.getClient(port);
client.getRequestContext().put(Message.ENDPOINT_ADDRESS, "http://some-valid-endpoint") ;

谢谢。你刚刚为我省了一天时间。如果您想使用生成的工厂类并动态更改端点地址,则这是正确的方法。 - mandroid

1

这对我有效。

String customerEndPoint = "https://localhost:8080/customerService/v1"

customerWebService = service.getCustomerWebServicePort();

((BindingProvider) customerWebService).getRequestContext()
                        .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                                customerEndPoint);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接