• JAX_WS 2.2 规范的webservices客户端实现(Axis2,Cxf)


    为了对接之前老版本的接口,折腾了好几个小时.

    主要是目前我的程序采用的是axis2的jax_rpc方式发布webservices服务,用这种服务的客户端,去调用老版本的jax_ws 2.2的接口,会报Runtime空指针。

    于是采用cxf,使用了cxf3.0.3(当前版本) 的wsdl2java工具,生成了客户端的代码:

    wsdl2java ****?wsdl

    写了一个测试类来调用:

    package com.test;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    /**
     * Created by wang on 15-1-27.
     */
    public class Test {
        public static void main(String[] args) {
            URL wsdlLocation= null;
            try {
                wsdlLocation = new URL("***");
                NocPacket nocPacket=new NocPacket();
                nocPacket.setPayload("lasdfsfsdf");
                EventForwarderService service=new EventForwarderService(wsdlLocation);
                EventForwarderInterface ss=service.getEventForwarderPort();
                FeedResult result=ss.send(nocPacket);
                System.out.println(result.getResultDesc());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
    }

    测试没问题,能够调用ok。

    不过此处有一个问题。如果用jdk7的话,它的包里面已经有jax_ws 2.2 的实现构造方法,不会报问题。但是如果用jdk6, cxf生成的代码中,继承的Services.class少一个带Feature的构造方法,jdk6默认只有一个构造。这里说的比较含糊,看一下jdk源码可以看出来问题的。用jdk6的话,要引入cxf的一个包:geronimo-jaxws_2.2_spec-1.2.jar 。cxf的压缩包自带的有。

    然后要配置下包的加载顺序,引入的geronimo-jaxws_2.2_spec-1.2包优先加载,其次是jdk。如果是eclipse,在环境路径中,修改一下顺序。如果是Idea,在module中,也调整一下顺序。这样,在jdk6下也可以正常使用。

    之所以没有采用cxf,是因为集成到axis2的环境中,包会冲突。

    自身用的axis2,却用cxf的client,太坑。发现axis2也有wsdl2java的工具,果断用它来生成了客户端代码,这个生成的代码只有两个类,看上去很简洁:

    wsdl2java -uri  ***?wsdl -o src

    配置一下生成代码的目录为src。

    代码是生成了,但是调用代码却折磨了好一会儿,根据网上的代码,是不行的。所以这里分享一下,以免后人多走弯路。

    package com.wang;
    
    import java.rmi.RemoteException;
    import org.apache.axis2.AxisFault;
    public class TestMain {
        public static void main(String[] args) {
                try {
                    NocPacket nocPacket=new NocPacket();  
                    nocPacket.setPayload("1232311");
                    String urlString="****";
                    EventForwarderServiceStub stub=new EventForwarderServiceStub(urlString);
                    Send send=new Send();
                    send.setNocPacket(nocPacket);
                    SendE sende=new SendE();
                    sende.setSend(send);;
                    try {
                        SendResponse response=stub.send(sende).getSendResponse();
                        FeedResult result=response.getResult();
                        System.out.println(result.getResultDesc());
                    } catch (RemoteException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                } catch (AxisFault e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
    }

    网上的代码,比如这里调用我需要的send方法的话,他们直接是用send方法。但是本人试验了很多次都不成功,必须中间经过SendE这个方法对象。不知道这个是不是axis2后来修改过。

    如此折腾了很久,终于在工程中,只用axis2就完成了服务端和客户端的所有操作。

  • 相关阅读:
    java解析xml
    支持向量机SVM
    资源-菜单
    GIT
    基于OpenCV的图书扫描识别程序开发
    最大公约数(gcd)还有最小公倍数(lcm)的共通之处
    python网页分析
    python爬虫的基本知识储备
    大数加法 (A + B Problem II)
    Andy's First Dictionary (set)
  • 原文地址:https://www.cnblogs.com/juepei/p/4256241.html
Copyright © 2020-2023  润新知