java 获取webservice_java动态获取WebService的两种方式(复杂参数类型)

本文详细介绍了两种在Java中动态获取并使用WebService的方法,包括利用JaxWsDynamicClientFactory创建Client对象,通过反射设置复杂参数类型,以及通过WsdlUrl直接调用服务。这两种方式都涉及了对XML消息部分的处理,并最终将返回的对象转换为JSON格式。

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() {

});

}

} 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 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 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转化为对象,没办法直接拿到。

需要的两个依赖:

org.apache.cxf

cxf-rt-frontend-jaxws

3.2.6

org.apache.cxf

cxf-rt-transports-http

3.2.7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值