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类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
随机推荐
- 背水一战 Windows 10 (114) - 后台任务: 后台任务的 Demo(与 app 不同进程), 后台任务的 Demo(与 app 相同进程)
[源码下载] 背水一战 Windows 10 (114) - 后台任务: 后台任务的 Demo(与 app 不同进程), 后台任务的 Demo(与 app 相同进程) 作者:webabcd 介绍背水一 ...
- 酷炫,用Html5/CSS实现文字阴影
前两天有一个学html5前端小美女问我一个有关文字阴影的效果怎么去实现.她和我说文字阴影嘛,她也知道text-shadow,.但是却做不出想要的样子,其实css3的新功能是很强大的,不要把你的思想太过 ...
- Java Web 开发中的中文乱码与解决方式
乱码产生的原因 不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的.以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器 ...
- HttpServlet的转发和重定向
HttpServletResponse重定向 1.HTTP协议规定了一种重定向的机制,重定向的运作流程如下 用户在浏览器输入特定的URL,请求访问服务端的某个组件. 服务端的组件返回一个状态码为302 ...
- Spring autowire自动装配 ByType和ByName
不使用自动装配前使用的是类的引用: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...
- JavaScript深入(操作BOM对象)
浏览器对象模型(BOM) BOM的核心是window, 向下有: document(文档):document下由button,text,from,等等表单元素组成. location(地址对象),hi ...
- txt文本处理---行未添加逗号
做音频处理过程中,经常遇到需要对文本进行转换,今天就遇到了一个行末加逗号的问题,找到了几种有效的方式,做个记录吧. 以下是几种方法实现: python代码实现: import os with open ...
- Docker - 参考信息
初见 从 0 开始了解 Docker 可能是把Docker的概念讲的最清楚的一篇文章 Docker新手指南 8 个基本的 Docker 容器管理命令 Docker 核心技术与实现原理 在线教程 Doc ...
- 设置python环境变量
原始环境变量 /> python Python |Anaconda (-bit)| (default, May , ::) [GCC (Red Hat -)] on linux Type &qu ...
- Ansible系列之roles使用说明
roles(角色)介绍 ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook.roles能够根据层次型结构自动装载变量文件.tasks以及handlers等.要使用ro ...