我正在编写一个CXF客户端。现在我必须集成安全性。我有从wsdl2java生成的这些类:MyService
、MyServiceProxy
、MyServiceHttpBindingStub
、MyServiceHttpService
和MyServiceHttpServiceLocator
。
到目前为止,我一直使用MyServiceProxy
类来向服务发出请求。根据手册,我必须以某种方式获得Endpoint
,这样我才能做到这一点:
endpoint.getOutInterceptors().add(wssOut);
在手册中,它是通过使用ClientProxy
助手类来解释的,如下所示:
Client client = ClientProxy.getClient(port);
Endpoint endpoint = client.getEndpoint();
但是如何从我的类中正确地创建port
呢?当我这样做时:
MyService port = (new MyServiceHttpServiceLocator()).getMyServiceHttpPort();
并将该端口放入ClientProxy方法,我得到一个运行时错误:
java.lang.IllegalArgumentException: not a proxy instance
那么,我如何获得端口,以便将其传递给ClientProxy.getClient()
?
您是否尝试创建服务的实例,然后从该实例检索端口?下面的"Logging Messages-for programming client side Logging"一节中有一个示例,说明如何在Apache CXF链接中以另一种方式获取端口。请注意,根据您使用的CXF的版本,步骤可能会有所不同。如果可能的话,另一个建议是使用配置文件。请参阅samples目录中的安全示例。调试和记录
MyService ws = new MyService();
MyPortType port = ws.getPort();
Client client = ClientProxy.getClient(port);
获取SOAP端口有效(无强制转换):
MyService service= new MyService(SERVICE_URL, SERVICE_NAME);
Operation port = service.getMyServiceSOAP12Port();
Client client = ClientProxy.getClient(port);
Endpoint cxfEndpoint = client.getEndpoint();