您的位置:首页 > 运维架构

soap-ws 获取wsdl中所有方法 (二)

2016-07-01 11:02 302 查看

2. 获取portType节点的所有operation

获取portType节点的operation比较麻烦,soap-ws没有提供直接可以使用的接口。

不过可以参考soap-ws的源码写一个方法。

soap-ws提供了一些example。参考例子:

soap-ws\soap-examples\quickstart\src\test\java\org\reficio\ws\quickstart\SoapClientExamplesTest.java

在IntelliJ IDEA中debug,eclipse中看起来不舒服。



可以看到在wsdl的私有成员soapFacade中有portType节点,binding节点信息。这些信息最终是定义在messageBuilder的私有变量definition中的,按照这个路径查看源代码。查看SoapMessageBuilder的构造方法。

public SoapMessageBuilder(URL wsdlUrl) throws WSDLException {
WSDLReader reader = new WSDLReaderImpl();
reader.setFeature("javax.wsdl.verbose", false);
this.definition = reader.readWSDL(wsdlUrl.toString());
this.definitionWrapper = new SchemaDefinitionWrapper(definition, wsdlUrl.toString());
}


根据上面的代码进行改造。完整的代码如下:

private static List<Operation> getPortTypeOperations(String wsdlUrl) {
List<Operation> operationList = new ArrayList();
try {
WSDLReader reader = new WSDLReaderImpl();
reader.setFeature("javax.wsdl.verbose", false);
Definition definition = reader.readWSDL(wsdlUrl.toString());
Map<String, PortTypeImpl> defMap = definition.getAllPortTypes();
Collection<PortTypeImpl> collection = defMap.values();
for (PortTypeImpl portType : collection) {
operationList.addAll(portType.getOperations());
}
} catch (WSDLException e) {
System.out.println("get wsdl operation fail.");
e.printStackTrace();
}
return operationList;
}


获取operation的名字

public static List<String> getOperationByUrl(String wsdlUrl) {
List<String> resultList = new ArrayList<>();
List<Operation> operationList = getPortTypeOperations(wsdlUrl);
for (Operation operation : operationList) {
resultList.add(operation.getName());
}
return resultList;
}


上面的方法也可以获取Binding节点的operation。代码如下

public static List<String> getAllBindingOperation(String wsdlUrl) {
List<BindingOperation> operationList = new ArrayList();
List<String> nameList = new ArrayList();
try {
WSDLReader reader = new WSDLReaderImpl();
reader.setFeature("javax.wsdl.verbose", false);
Definition definition = reader.readWSDL(wsdlUrl.toString());
Map<String, BindingImpl> defMap = definition.getAllBindings();
Collection<BindingImpl> collection = defMap.values();
for (BindingImpl binding : collection) {
operationList.addAll(binding.getBindingOperations());
}
for (BindingOperation operation:operationList) {
nameList.add(operation.getName());
}
} catch (WSDLException e) {
System.out.println("get wsdl operation fail.");
e.printStackTrace();
}
return nameList;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息