2. 获取portType节点的所有operation 获取portType节点的operation比较麻烦,soap-ws没有提供直接可以使用的接口。 不过可以参考soap-ws的源码写一个方法。 soap-ws提供了一些example。参考例子:
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; }