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类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
随机推荐
- Dubbo 源码分析 - 集群容错之 Directory
1. 简介 前面文章分析了服务的导出与引用过程,从本篇文章开始,我将开始分析 Dubbo 集群容错方面的源码.这部分源码包含四个部分,分别是服务目录 Directory.服务路由 Router.集群 ...
- dcloud 近期遇到的小知识一览
1.form-data时,请求头改变为application/x-www-form-urlencoded. 2.下拉刷新,首先在page.json里面的style将enablePullDownRefr ...
- 110道python面试笔试题汇总,你能答对几道?
数据分析系列教程插播一篇面试题教程,最近公众号新来了不少朋友,这几天不少粉丝留言说问我有没有python面试题,其实之前分享过一些面试题,今天统一再给大家分享一遍,也希望能帮助此时仍在找工作的同学,尽 ...
- Oracle优化器基础知识之访问数据的方法
目录 一.访问数据的方法 1.直接访问数据 2.访问索引 一.访问数据的方法 Oracle访问表中数据的方法有两种,一种是直接表中访问数据,另外一种是先访问索引,如果索引数据不符合目标SQL,就回表, ...
- Node.js项目拆包工程化
背景 在我们开发的过程中,经常会遇到这样的问题,开发完了一些代码或者一个接口,别的小伙伴过来问你,代码可不可以给他复用,接口可以给他调用.这说明代码的复用和抽象对团队协作是很重要的.举个例子,如下图 ...
- Collection 和 Collections;Array与Arrays的区别
Collection 和 Collections 的区别. Collection 是个 java.util 下的接口 ,它是各种集合结构的父接口.继承与他的接口主要有 Set 和 List. Col ...
- @vue/cli 构建得项目eslint配置
如下:package.json // package.json { "name": "ecommerce-mall-front", "version& ...
- SonarQube 集成 GitLabCI
本文是用于分析SonarQube代码的质量,每次在GitLab上提交代码时都使用GitLab-CI运行器进行检查. 1.SonarQube with GitLab 安装插件GitLab-plugin ...
- mysql 开发基础系列7 流程函数与其它函数
一.流程函数 -- 创建表来介绍 ,)); ,),(,), (,),(,),(,), (,NULL); SELECT * FROM salary 1. if(value,t,f) 超过2000的用h ...
- [Jenkins]Jenkins构建时提示java.io.IOException: No space left on device
突然发现Jenkins的Job全部都停了,打开Jenkins发现所有的slave机器,均提示: 点开Dead(!),提示Thread has died,如下图: 看图好像说是Jenkins所在的服务器 ...