java动态获取WebService的两种方式(复杂参数类型)
java动态获取WebService的两种方式(复杂参数类型)
第一种:
@Override
public OrderSearchListRes searchOrderList(Order_FlightOrderSearchRequest request) {
Object myAllMessage;
OrderSearchListRes response = null;
try {
String endpoint = carGlobalSetting.getEndpoint();
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
org.apache.cxf.endpoint.Client client = dcf
.createClient(endpoint);
QName name = new QName(carGlobalSetting.getNamespaceURI(), "searchOrderList");
Object person = Thread.currentThread().getContextClassLoader().loadClass("com.uni.webservice.service.neworder.inter.OrderSearchReq").newInstance();
Method m1 = person.getClass().getMethod("setSalesChannel", String.class);
Method m2 = person.getClass().getMethod("setPassportId", Long.class);
Method m3 = person.getClass().getMethod("setBeginDate", Integer.class);
Method m4 = person.getClass().getMethod("setEndDate", Integer.class);
Method m5 = person.getClass().getMethod("setOrderStatus", String.class);
Method m6 = person.getClass().getMethod("setPage", Integer.class);
Method m7 = person.getClass().getMethod("setPageSize", Integer.class);
m1.invoke(person, request.getSalesChannel());
m2.invoke(person, request.getPassportId());
m3.invoke(person, request.getBeginDate());
m4.invoke(person, request.getEndDate());
m5.invoke(person, request.getOrderStatus());
m6.invoke(person, request.getPage());
m7.invoke(person, request.getPageSize());
try {
myAllMessage = client.invoke(name, person);
LogHelper.debug(myAllMessage.toString());
String s = JSON.toJSONString(myAllMessage);
JSONArray jsonArray = JSON.parseArray(s);
/**
* 将Json转为具体对象
*/
for (Object o :
jsonArray) {
JSONObject j = (JSONObject) o;
response = JSON.parseObject(j.toJSONString(), new TypeReference<OrderSearchListRes>() {
});
}
} catch (Exception e) {
LogHelper.error("Json转化异常"+e.getMessage()+e.getStackTrace(),
"searchOrderList","searchOrderList");
}
} catch (Exception e) {
LogHelper.error("获取WebService异常"+e.getMessage()+e.getStackTrace(),
"searchOrderList","searchOrderList");
}
return response;
}
第二种:
private static String wsdlUrl = "http://172.20.29.51:8180/uniplatform/service/UniNewOrderDataService?wsdl";
public static void main(String[] args) throws Exception {
// 创建动态客户端
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client = factory
.createClient(wsdlUrl);
/**endpoint据说为http://172.20.29.51:8180/uniplatform/service/UniNewOrderDataService
* 不过toString方法打印的为{},有点奇怪,不过getEndpointInfo打印的为BindingQName,ServiceQName,QName*/
Endpoint endpoint = client.getEndpoint();
/**获取Service*/
ServiceInfo serviceInfo = endpoint.getService().getServiceInfos().get(0);
/**创建Service*/
Collection<BindingInfo> bindings = serviceInfo.getBindings();
BindingInfo binding = null;
for (BindingInfo b :
bindings) {
binding = b;
}
/**创建Service下的方法*/
QName opName = null;
for (BindingOperationInfo bindingOperationInfo:
binding.getOperations()) {
if ("searchOrderList".equals(bindingOperationInfo.getName().getLocalPart())){
opName = bindingOperationInfo.getName();
}
}
BindingOperationInfo operation2 = binding.getOperation(opName);
BindingMessageInfo input = null;
if (operation2.isUnwrapped()){
input = operation2.getUnwrappedOperation().getInput();
} else {
input = operation2.getWrappedOperation().getInput();
}
List<MessagePartInfo> messageParts = input.getMessageParts();
MessagePartInfo messagePartInfo = messageParts.get(0);
Class<?> partClass = messagePartInfo.getTypeClass();
Object inputObject = partClass.newInstance();
PropertyDescriptor partPropertyDescriptor = new PropertyDescriptor("salesChannel", partClass);
partPropertyDescriptor.getWriteMethod().invoke(inputObject, "712");
PropertyDescriptor partPropertyDescriptor2 = new PropertyDescriptor("passportId", partClass);
partPropertyDescriptor2.getWriteMethod().invoke(inputObject, Long.valueOf("31498882"));
PropertyDescriptor partPropertyDescriptor3 = new PropertyDescriptor("beginDate", partClass);
partPropertyDescriptor3.getWriteMethod().invoke(inputObject, 20181230);
PropertyDescriptor partPropertyDescriptor4 = new PropertyDescriptor("endDate", partClass);
partPropertyDescriptor4.getWriteMethod().invoke(inputObject, 20190109);
PropertyDescriptor partPropertyDescriptor5 = new PropertyDescriptor("orderStatus", partClass);
partPropertyDescriptor5.getWriteMethod().invoke(inputObject, "10054");
Object[] result = client.invoke(opName, inputObject);
}
最后,返回的Object类型数据还是只能先将其转为Json,再将Json转化为对象,没办法直接拿到。
需要的两个依赖:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.7</version>
</dependency>
java动态获取WebService的两种方式(复杂参数类型)的更多相关文章
- Java执行groovy脚本的两种方式
记录Java执行groovy脚本的两种方式,简单粗暴: 一种是通过脚本引擎ScriptEngine提供的eval(String)方法执行脚本内容:一种是执行groovy脚本: 二者都通过Invocab ...
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- java中数组复制的两种方式
在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...
- MyBatis获取参数值的两种方式
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单 ...
- WebService的两种方式Soap和Rest比较
我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...
- WebService的两种方式SOAP和REST比较 (转)
我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...
- cxf构建webservice的两种方式
一.简介 对于基于soap传输协议的webservice有两种开发模式,代码优先和契约优先的模式.代码优先的模式是通过编写服务器端的代码,使用代码生成wsdl:契约优先模式首先编写wsdl,再通过ws ...
- java中实现同步的两种方式:syschronized和lock的区别和联系
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...
- Java值创建线程的两种方式对比
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
随机推荐
- [转] Firewall and network filtering in libvirt
Firewall and network filtering in libvirt There are three pieces of libvirt functionality which do n ...
- python写的压缩软件
import tkinterimport tkinter.filedialogimport osimport zipfileimport tkinter.messagebox #创建住窗口root = ...
- vi命令详解(转)
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- ubuntu 16.04下安装ADB
1. 安装adb工具. 从谷歌的网站下载LINUX adb调试工具(FQ),当然可以随便百度一个一大堆. http://developer.android.com/tools/device.html ...
- os模块及其API&属性
模块: os os.path 所包含API列表: os.uname: 获取详细的系统信息 os.rename: 文件重命名 os.remove: 删掉文件 os.mkdir: 创建一个目录 os.rm ...
- ionic hidden scroll bar
ionic 项目中隐藏所有的ion-content滚动条 在variables.scss文件中添加以下代码 ::-webkit-scrollbar { display: none; }
- 浅谈Unity3D 骨骼动画
转载请标明出处http://www.cnblogs.com/zblade/ 最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭 ...
- 移动设备(手机)的唯一ID有哪些
移动设备(手机)的唯一ID有哪些 在移动广告领域,设备的ID 是用来追踪一个人的最重要的标识. 对于APP自身产品而言,使用设备唯一ID可以追踪到用户从下载到激活.注册.使用.流失.回归的全流程数据, ...
- 一套能体现 RBAC 的表结构设计
1.RBAC 概述 2.表结构设计 2.1.用户表 2.2.角色表 2.3.权限表 2.4.用户角色(关系)表 2.5.角色权限(关系)表 3.总结 1.RBAC 概述 RBAC(Role-Based ...
- Canal 源码走读
前言 canal 是什么? 引用一下官方回答: 阿里巴巴mysql数据库binlog的增量订阅&消费组件 canal 能做什么? 基于日志增量订阅&消费支持的业务: 数据库镜像 数据库 ...