zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    php将字符串形式的数组转化为真数组
    Mysql8.0及以上 only_full_group_by以及其他关于sql_mode原因报错详细解决方案
    php使用base64_encode和base64_decode对数据进行编码和解码
    大数据基本概念
    sonarqube安装部署
    git-修改commit信息
    NLP-Commen Sense
    索引生命周期的管理
    kibana软件具体参数配置信息
    es机器监控x-pack导致的监控存储过大的问题
  • 原文地址:https://www.cnblogs.com/bihanghang/p/10323965.html
Copyright © 2011-2022 走看看