wsimport生成客户端+客户端调用+客户端修改adress location

 

原生webservice调用大概逻辑如下:

  客户端访问服务端wsdl,根据返回值查到对应需要使用的服务的wsdl service location,根据查询到的location发起真正的数据交换请求。

业务场景:

  客户暴露http://127.0.0.1:8082/MsgETLServer/services/general?wsdl端口,但wsdl绑定的端口却是8080,在使用具体接口时,由于网络不通或服务端并未提供8080口时,会出现调用失败。

扫描二维码关注公众号,回复: 11145427 查看本文章

解决方案:

  1. 生成客户端代码:

wsimport -keep -d D:\test\wsimport\d -s D:\test\wsimport\s -p com.iflytek.aisp.job.biz.custom.scdx.proxy -verbose http://127.0.0.1:8082/MsgETLServer/services/general?wsdl 

-keep:是否生成java源文件

-d:指定.class文件的输出目录

-s:指定.java文件的输出目录

-p:定义生成类的包名,不定义的话有默认包名

-verbose:在控制台显示输出信息

-b:指定jaxws/jaxb绑定文件或额外的schemas

-extension:使用扩展来支持SOAP1.2

  2. 使用客户端代码

将代码置于项目,编写测试类:

 public static void main(String[] args) {
        General general = null;
        try {
            //使用本地文件
            //general = new General(new URL("file:\\D:\\test\\wsimport\\scdx.wsdl"));
            //使用http地址
            general = new General(new URL("http://127.0.0.1:8082/MsgETLServer/services/general?wsdl"));
            GeneralPortType generalPortType = general.getGeneralHttpSoap11Endpoint();
            StringBuilder sb = new StringBuilder();
            sb.append("<receipt><item><data_id>").append(56789).append("</data_id><receiptInfo><![CDATA[").append(56789).append("]]></receiptInfo></item></receipt>");
            String res = generalPortType.storeData("YIWAN", "YUYIN", sb.toString(), 0);
            System.out.println(res);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

    }

  

  当遇到如前面提到的场景时,需要进行如下操作:  

  3. 浏览器访问或curl wsdl地址,将内容保存为一个wsdl文件。(复制页面中内容保存即可)

  4. 修改wsdl中要使用的地址为步骤3中的curl地址(即局方开放的地址)。

   5. 将文件保存在与客户端同一环境下,把如上http地址修改为文件绝对路径或相对路径,重新调用测试样例即可。

    public static void main(String[] args) {
        General general = null;
        try {
            //使用本地文件
            general = new General(new URL("file:\\D:\\test\\wsimport\\scdx.wsdl"));
            //使用http地址
//            general = new General(new URL("http://127.0.0.1:8082/MsgETLServer/services/general?wsdl"));
            GeneralPortType generalPortType = general.getGeneralHttpSoap11Endpoint();
            StringBuilder sb = new StringBuilder();
            sb.append("<receipt><item><data_id>").append(56789).append("</data_id><receiptInfo><![CDATA[").append(56789).append("]]></receiptInfo></item></receipt>");
            String res = generalPortType.storeData("YIWAN", "YUYIN", sb.toString(), 0);
            System.out.println(res);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

    }

运行结果:

  使用远程地址时,异常(Connection refused):

  使用本地文件并将路径修改一致后,成功:

猜你喜欢

转载自www.cnblogs.com/loserCoder/p/12795816.html
今日推荐