gboat2.cxf.utils
类 CXFUtil

java.lang.Object
  继承者 gboat2.cxf.utils.CXFUtil

public class CXFUtil
extends Object

使用 CXF 发布 WebService 服务和调用 WebService 服务的工具类。
注:目前只提供了调用 WebService 服务相关的方法,而没提供发布服务相关的方法

该工具类解决了在 OSGI 环境中直接使用 CXF wsdl2java 生成的代码调用 WebService 时的以下问题:
  1. 传递复杂对象时,会抛出“javax.xml.ws.WebServiceException: Could not find wsdl:binding operation info for web method ...”的异常
  2. 当 WebService 服务端的接口和实现类在不同的包下,而且实现类没指定 @WebService 注解的 targetNamespace 属性时,会抛出“org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name ...”的异常。
传递复杂参数(JavaBean)调用 WebService 服务的步骤:
  1. 使用 CXF 的 wsdl2java 工具生成 Java 代码;
  2. 使用刚才生成的 JavaBean 创建对象实例,并赋值;
  3. 调用本工具类的 invokeWebService(String, String, Object...) 方法,将刚才创建的 JavaBean 实例作为参数传入;
  4. 如果返回结果中包含复杂对象(JavaBean),则可以通过 Spring 的 BeanUtils 或 commons-beanutils 的 BeanUtils 工具类将返回结果转换成刚才通过 wsdl2java 生成的 JavaBean,或是通过 json 工具进行转换(先将结果中的 JavaBean 转换成 json 字符串,再将 json 字符串转换成自己的 JavaBean),这样就可以更方便的读取返回结果中的具体信息了。

从以下版本开始:
3.0
作者:
何明旺

方法摘要
static org.apache.cxf.endpoint.Client createJaxWsDynamicClient(String wsdlUrl)
          动态创建 WebService 的 JAX-WS 方式调用客户端实例
和直接执行 createJaxWsDynamicClient(wsdlUrl, JaxWsDynamicClientFactory.class.getClassLoader()) 返回的结果一样
static org.apache.cxf.endpoint.Client createJaxWsDynamicClient(String wsdlUrl, ClassLoader classLoader)
          动态创建 WebService 的 JAX-WS 方式调用客户端实例
static org.apache.cxf.service.model.BindingOperationInfo getBindingOperationInfo(org.apache.cxf.endpoint.Client client, String operation)
          获取 CXF 的绑定操作信息的实例
static Map<String,Class<?>> getInputParameters(org.apache.cxf.service.model.BindingOperationInfo operationInfo)
          获取操作对象的输入参数
static Map<String,Class<?>> getOutputParameters(org.apache.cxf.service.model.BindingOperationInfo operationInfo)
          获取操作对象的输出参数
static Object[] invokeWebService(org.apache.cxf.endpoint.Client client, String operation, Object... parameters)
          调用 webservice 服务
static Object[] invokeWebService(String wsdlUrl, String operation, ClassLoader classLoader, Object... parameters)
          调用 webservice 服务
static Object[] invokeWebService(String wsdlUrl, String operation, Object... parameters)
          调用 webservice 服务
和直接执行 invokeWebService(wsdlUrl, operation, JaxWsDynamicClientFactory.class.getClassLoader(), parameters) 返回的结果一样
static Object[] invokeWrappedWebService(org.apache.cxf.endpoint.Client client, Object parameter)
          调用 WebService 服务
static Object[] invokeWrappedWebService(String wsdlUrl, Object parameter)
          调用 WebService 服务
static Object[] invokeWrappedWebService(String wsdlUrl, Object parameter, ClassLoader classLoader)
          调用 WebService 服务
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法详细信息

createJaxWsDynamicClient

public static org.apache.cxf.endpoint.Client createJaxWsDynamicClient(String wsdlUrl)
动态创建 WebService 的 JAX-WS 方式调用客户端实例
和直接执行 createJaxWsDynamicClient(wsdlUrl, JaxWsDynamicClientFactory.class.getClassLoader()) 返回的结果一样

参数:
wsdlUrl - WSDL 地址
返回:

createJaxWsDynamicClient

public static org.apache.cxf.endpoint.Client createJaxWsDynamicClient(String wsdlUrl,
                                                                      ClassLoader classLoader)
动态创建 WebService 的 JAX-WS 方式调用客户端实例

参数:
wsdlUrl - WSDL 地址
classLoader - 类加载器,调用 CXF 的 DynamicClientFactory#createClient(String, ClassLoader) 方法动态创建客户端时,将使用此类加载器
返回:

getBindingOperationInfo

public static org.apache.cxf.service.model.BindingOperationInfo getBindingOperationInfo(org.apache.cxf.endpoint.Client client,
                                                                                        String operation)
获取 CXF 的绑定操作信息的实例

参数:
client - CXF 客户端,可通过 createJaxWsDynamicClient(String) 进行创建
operation - 操作名称(一般和方法名相同),如: sayHello
返回:
绑定操作信息的实例。如果没有找到对应的绑定操作,则返回 null

getInputParameters

public static Map<String,Class<?>> getInputParameters(org.apache.cxf.service.model.BindingOperationInfo operationInfo)
获取操作对象的输入参数

参数:
boi - 操作对象
返回:
操作的输入参数 Map,key 为参数的名称,value 为参数的类型

getOutputParameters

public static Map<String,Class<?>> getOutputParameters(org.apache.cxf.service.model.BindingOperationInfo operationInfo)
获取操作对象的输出参数

参数:
boi - 操作对象
返回:
操作的输出参数 Map,key 为参数的名称,value 为参数的类型

invokeWebService

public static Object[] invokeWebService(String wsdlUrl,
                                        String operation,
                                        Object... parameters)
调用 webservice 服务
和直接执行 invokeWebService(wsdlUrl, operation, JaxWsDynamicClientFactory.class.getClassLoader(), parameters) 返回的结果一样

参数:
wsdlUrl - WSDL 地址
operation - 要调用的操作(WebService 服务名称)
parameters - 参数列表,如果没有参数,则可以不传入该参数值
返回:
WebService 服务端返回的结果
另请参见:
invokeWebService(String, String, ClassLoader, Object...)

invokeWebService

public static Object[] invokeWebService(String wsdlUrl,
                                        String operation,
                                        ClassLoader classLoader,
                                        Object... parameters)
调用 webservice 服务

参数:
wsdlUrl - WSDL 地址
operation - 要调用的操作(WebService 服务名称)
classLoader - 类加载器,调用 CXF 的 DynamicClientFactory#createClient(String, ClassLoader) 方法动态创建客户端时,将使用此类加载器
parameters - 参数列表,如果没有参数,则可以不传入该参数值
返回:
WebService 服务端返回的结果

invokeWebService

public static Object[] invokeWebService(org.apache.cxf.endpoint.Client client,
                                        String operation,
                                        Object... parameters)
调用 webservice 服务

参数:
client - WebService 客户端实例对象
operation - 要调用的操作(WebService 服务名称)
parameters - 参数列表,如果没有参数,则可以不传入该参数值
返回:
服务端返回的结果

invokeWrappedWebService

public static Object[] invokeWrappedWebService(String wsdlUrl,
                                               Object parameter)
调用 WebService 服务

参数:
wsdlUrl - WSDL 地址
parameter - 经过包装后的请求参数,与 WSDL 文件中 <wsdl:operation name="xxx"> 相对应的 JavaBean,该类必须有 @XmlRootElement 注解,@XmlRootElement 注解的 name 属性对应 WSDL 文件中 operation 的 name
返回:
WebService 服务端的返回结果

invokeWrappedWebService

public static Object[] invokeWrappedWebService(String wsdlUrl,
                                               Object parameter,
                                               ClassLoader classLoader)
调用 WebService 服务

参数:
wsdlUrl - WSDL 地址
parameter - 经过包装后的请求参数,与 WSDL 文件中 <wsdl:operation name="xxx"> 相对应的 JavaBean,该类必须有 @XmlRootElement 注解,@XmlRootElement 注解的 name 属性对应 WSDL 文件中 operation 的 name
classLoader - 类加载器,调用 CXF 的 DynamicClientFactory#createClient(String, ClassLoader) 方法动态创建客户端时,将使用此类加载器
返回:
WebService 服务端的返回结果

invokeWrappedWebService

public static Object[] invokeWrappedWebService(org.apache.cxf.endpoint.Client client,
                                               Object parameter)
调用 WebService 服务

参数:
client - WebService 客户端实例对象
parameter - 经过包装后的请求参数,与 WSDL 文件中 <wsdl:operation name="xxx"> 相对应的 JavaBean,该类必须有 @XmlRootElement 注解,@XmlRootElement 注解的 name 属性对应 WSDL 文件中 operation 的 name
返回:
WebService 服务端的返回结果


Copyright © 2014 广联达软件股份有限公司(Glodon Software Co., Ltd.). All rights reserved.