RPC(RPCServiceClient)调用外系统WebService SOAP接口

本文详细介绍使用Apache Axis2库实现Webservice接口调用的过程,包括封装调用工具类、报文组装及XML处理,适用于远程接口调用场景。

RPC调用Webservice接口是一种远程调用的方式,通过指定Webservice接口的调用地址、命名空间、调用的方法名调用远程接口获取结果
调用的核心类是 org.apache.axis2.rpc.client.RPCServiceClient
调用的远程接口有返回值用 invokeBlocking 方法,无返回值使用 invokeRobust 方法
本例使用的是invokeBlocking 方法。整个示例具体分为三步

1. 封装接口调用工具类 WebServiceInvokeUtil
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.springframework.stereotype.Component;

import javax.xml.namespace.QName;

/**
 * @className: WebServiceInvokeUtil
 * @Description:
 * @author:
 * @date: 2019/10/31  10:33
 * @return:
 * @version: 1.0
 */
@Component
public class WebServiceInvokeUtil {
    /**
     *
     * @param object  拼装报文传入的实体类
     * @param msgNo   是此示例中拼装报文工具类方法中需要传的参数
     * @param URL  请求路径
     * @param methodName  接口方法名
     * @param namepaceURL 命名空间
     * @param timeout
     * @param ticket  是此示例中拼装报文工具类方法中需要传的参数
     * @return
     * @throws Exception
     */
    public String invoke(Object object , String msgNo, String URL, String methodName, String namepaceURL, long timeout, String ticket) throws Exception {
        String rspXmlStr ="";
        String reqXmlStr="";
        RPCServiceClient sender=null;
        try {
            EndpointReference targetEPR = new EndpointReference(URL);//指定webservice接口地址
            QName qname = new QName(namepaceURL,methodName);//设置命名空间和调用的方法名
            sender = new RPCServiceClient();//创建远程调用接口的RPC(RPCServiceClient)对象
            Options options = sender.getOptions();
            options.setTimeOutInMilliSeconds(timeout);//超时时间20s
            options.setTo(targetEPR);//设置接口的调用地址
            Class<?>[] types = new Class[]{String.class};  //这是针对返值类型的设置
            /*
                此处是使用工具类江传入的参数实体转换成请求的XML字符串 reqXmlStr
            */
            Object[] param = new Object[]{reqXmlStr};//设置请求的报文
            Object[] response1 = sender.invokeBlocking(qname, param, types);
            rspXmlStr  =  (String) response1[0];

        } catch (AxisFault e) {
            e.printStackTrace();
        }
        return  rspXmlStr;
    }
}

2. 封装报文组装工具类 BasicUtils
  • 创建两个作为头信息和整个请求信息的实体类
    Head类封装头请求报文的头信息
    RequestInfo 封装整个请求报文信息
import lombok.Data;

import javax.xml.bind.annotation.XmlRootElement;

/**
 * @className: Head
 * @Description:
 * @author:
 * @date: 2019/10/31  9:26
 * @return:
 * @version: 1.0
 */
@Data
@XmlRootElement
public class Head {
    private String MSGNO;//交易代码
    private String MSGID;//交易请求流水号
    private String REQTIME;//业务发起日期
}

```java
package com.gongchen.springboot.entity;

import lombok.Data;

/**
 * @className: RequestInfo
 * @Description:
 * @author:
 * @date: 2019/10/31  9:31
 * @return:
 * @version: 1.0
 */
@Data
public class RequestInfo<T> {
    private Head HEAD;
    private T CONTENT;
}

BasicUtil



import cn.hutool.json.XML;
import com.gone.springboot.entity.Head;
import com.gone.springboot.entity.RequestInfo;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.naming.NoNameCoder;
import com.thoughtworks.xstream.io.xml.Xpp3Driver;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @className: BasicUtils
 * @Description:
 * @author:
 * @date: 2019/10/31  9:37
 * @return:
 * @version: 1.0
 */
public class BasicUtils {
    private static String XML_TAG = "<?xml version='1.0' encoding='UTF-8'?>";
    /**
     * RequestInfo 转 xml
     * @param r  ResultInfo 基础库实体
     * @param clazz data所属实体
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static <T> String getXmlFromRequestInfo(RequestInfo r,Class<T> clazz) {
        XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
        xStream.alias("ROOT", r.getClass());
        xStream.aliasSystemAttribute(null, "class");
        return addHeaderByXml(xStream.toXML(r));
    }

    public static <T> String getXmlFromRequestInfo(RequestInfo r) {
        XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
        xStream.alias("ROOT", r.getClass());
        xStream.aliasSystemAttribute(null, "class");
        return addHeaderByXml(xStream.toXML(r));
    }
    /**
     * 添加消息头至xml
     * @param  xml
     * @return
     */
    public static String addHeaderByXml(String xml) {
        StringBuffer buff=new StringBuffer();
        buff.append(XML_TAG);
        buff.append("\r\n"+xml);
        return buff.toString();
    }

    /**
     * xml to json
     * @param xml
     * @return
     */
    public static String xml2json(String xml) {
        return XML.toJSONObject(xml).toString();
    }


    /**
     *   初始化数据中心webservice请求头信息
     * @param ticket
     * @return
     */
    public static Head initHead( String msgNo) {
        Head head = new Head();
        head.setREQTIME("2019-12-31");
        head.setMSGID(getMsgId());
        head.setMSGNO(msgNo);//
        return head;
    }

    /**
     * @param obj datalist数据,非list
     * 创建数据中心webservice请求格式
     * @return
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static RequestInfo createRequestInfo(Object obj,String msgNo) {
        RequestInfo r = new RequestInfo<>();
        r.setHEAD(initHead(msgNo));
        r.setCONTENT(obj);
        return r;
    }

    /**
     * 生成流水号
     * @return
     */
    private static String getMsgId(){
        LocalDateTime date = LocalDateTime.now();
        System.out.println("当前日期=" + date);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddhhmmssSSS");
        System.out.println(date.format(formatter));
        return "36000000"+date.format(formatter);
    }

    /**
     * 拼装需要的xml格式
     * @param obj
     * @param ticket
     * @param msgNo
     * @return
     */
    public static String getXmlFromObj(Object obj,String ticket,String msgNo){
        RequestInfo<?> r = createRequestInfo(obj,msgNo);
        String xml = getXmlFromRequestInfo(r);
        return xml;
    }
}

3. 工具类 WebServiceInvokeUtil合并BasicUtils转换XML报文的部分调用
import com.gone.springboot.entity.RequestInfo;
import com.gone.springboot.utils.BasicUtils;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.springframework.stereotype.Component;

import javax.xml.namespace.QName;

/**
 * @className: WebServiceInvokeUtil
 * @Description:
 * @author:
 * @date: 2019/10/31  10:33
 * @return:
 * @version: 1.0
 */
@Component
public class WebServiceInvokeUtil {
    /**
     *
     * @param object  拼装报文传入的实体类
     * @param msgNo   是此示例中拼装报文工具类方法中需要传的参数
     * @param URL  请求路径
     * @param methodName  接口方法名
     * @param namepaceURL 命名空间
     * @param timeout
     * @param ticket  是此示例中拼装报文工具类方法中需要传的参数
     * @return
     * @throws Exception
     */
    public String invoke(Object object , String msgNo, String URL, String methodName, String namepaceURL, long timeout, String ticket) throws Exception {
        String rspXmlStr ="";
        String reqXmlStr="";
        RPCServiceClient sender=null;
        try {
            EndpointReference targetEPR = new EndpointReference(URL);//指定webservice接口地址
            QName qname = new QName(namepaceURL,methodName);//设置命名空间和调用的方法名
            sender = new RPCServiceClient();//创建远程调用接口的RPC(RPCServiceClient)对象
            Options options = sender.getOptions();
            options.setTimeOutInMilliSeconds(timeout);//超时时间20s
            options.setTo(targetEPR);//设置接口的调用地址
            Class<?>[] types = new Class[]{String.class};  //这是针对返值类型的设置

            /*  此处是使用工具类江传入的参数实体转换成请求的XML字符串 reqXmlStr */
            RequestInfo<?> r = BasicUtils.createRequestInfo(object,msgNo);
            reqXmlStr = BasicUtils.getXmlFromRequestInfo(r);

            Object[] param = new Object[]{reqXmlStr};//设置请求报文
            Object[] response1 = sender.invokeBlocking(qname, param, types);
            rspXmlStr  =  (String) response1[0];

        } catch (AxisFault e) {
            e.printStackTrace();
        }
        return  rspXmlStr;
    }
}

---------------------------------------------------------------------------------------------

  • BasicUtils中组装XML报文是通过XStream BasicUtils和WebserviceUtils两个类中引入的jar包依赖如下
		<dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>com.springsource.com.thoughtworks.xstream</artifactId>
            <version>1.4.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.12</version>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-client</artifactId>
            <version>3.1.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2</artifactId>
            <version>1.6.3</version>
            <type>pom</type>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-adb</artifactId>
            <version>1.6.3</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-kernel</artifactId>
            <version>1.6.3</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-transport-http</artifactId>
            <version>1.6.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-transport-local</artifactId>
            <version>1.6.3</version>
        </dependency>
  • 在Head类里面的定义的头信息的字段的值在BasicUtils中是需要进行设置的

  • 在BasicUtils中还有xml转为JSON的方法,对于我们需要获得JSON对象再转换成实体返回的操作是可以直接使用再进行转换的

内容概要:本文介绍了如何利用 GitHub Copilot 辅助进行程序调试与 Bug 分析,强调 Copilot 不仅可用于代码生成,更是强大的代码分析与调试工具。文章详细阐述了 Copilot 在调试复杂问题、老旧项目维护和难以复现 Bug 场景下的优势,提出了“先分析、再修改”的四步流程:分析原因→评估风险→提出方案→修改代码,并推荐结合错误日志、用户操作等信息精准提问,提升 AI 回答质量。同时展示了如何通过 Copilot 增强调试能力,如自动加日志、异常保护、生成测试数据和性能分析。最后通过游戏拾取系统的实际案例,说明如何结构化描述问题以获得有效反馈。; 适合人群:具备一定开发经验,正在参与项目调试或维护工作的程序员,尤其是面对复杂逻辑、历史代码或难复现 Bug 的 1-3 年开发者;也适合希望提升 AI 协作能力的技术人员。; 使用场景及目标:①快速定位偶发性崩溃、数据异常等问题根源;②理解无文档或结构混乱的老代码模块;③优化调试流程,借助 AI 生成诊断建议、修复方案与测试用例;④构建更具健壮性的程序,提前发现潜在缺陷。; 阅读建议:学习者应结合自身项目中的真实问题,按照文中提供的结构化提问模板实践,逐步训练与 Copilot 的协作能力,重视问题描述的完整性与准确性,避免直接要求修改代码,优先通过分析提升对系统的理解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值