• Axis2 webservice 之使用java调用webservice


    在上一篇中写了一个简单了webservice,实现了一个sayHello功能。那么webservice写好之后我们如何使用Java程序来调用webservice呢?

    一、java调用的webservice的第一种方式:RPC调用AXIS2 webservice
        下面这个方法是我抽象出来的一个方法,

    import javax.xml.namespace.QName;
    
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.rpc.client.RPCServiceClient;
    
    public class Client {
    
        /**
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {
            // 调用PublishWebService
            String wsdlUrl = "http://localhost:8080/DigitalProduct/services/PublishWebService?wsdl";//webservice地址
            String method = "updatePublishSysParam"; //调用的那个方法
            Object[] param = new Object[] { "AASSDDFF" };//传递的参数值
            String namespaceUrl1 = "http://service.digitalproduct.tkbs.com";//命名空间
            Class[] opReturnType1 = new Class[] { String[].class };//返回值类型
            String result = axis2RPCInvoke(wsdlUrl, method, param, namespaceUrl1,opReturnType1);
            System.out.println(result);
        }
    /**
         * RPC调用AXIS2 webservice
         * 
         * @param wsdlUrl
         *            服务地址 如:http://192.168.0.1:2597/aixs2/services/jqservice?wsdl
         * @param methodName
         *            方法名 如<xs:element name="Receive">
         * @param parameter
         *            方法参数 如Object[] opArgs = new Object[] { param };
         * @param namespaceURI
         *            命名空间 如 :targetNamespace="http://server.test.com.cn">
         * @param returnType
         *            返回类型 如字符串:Class[] opReturnType = new Class[] { String[].class
         *            };
         */
        public static String axis2RPCInvoke(String wsdlUrl, String methodName,
                Object[] parameter, String namespaceURI, Class[] returnType) {
            Object[] ret = null;
            RPCServiceClient serviceClient = null;
            try {
                /*
                 * 此处RPCServiceClient 对象实例建议定义成类中的static变量 ,否则多次调用会出现连接超时的错误。
                 */
                serviceClient = new RPCServiceClient();
                Options options = serviceClient.getOptions();
                EndpointReference targetEPR = new EndpointReference(wsdlUrl);
                options.setTo(targetEPR);
                QName opQName = new QName(namespaceURI, methodName);
                ret = serviceClient.invokeBlocking(opQName, parameter, returnType);
                // System.out.println(((String[]) ret[0])[0]);
            } catch (AxisFault e) {
                e.printStackTrace();
            }
            return ((String[]) ret[0])[0];
        }
    }

    二、使用java调用webservice的第二种方式:使用myeclipse中的axis2插件生成客户端代码

    new -->others到如下界面:

        点next 到如下界面:

    现在我们想生成调用webservice的客户端代码,首先我们需要生成一个service.wsdl文件,选择第2个,点next,

    在界面里边点击add folder 选择项目--》webroot--》webinf-->classes,输入好webservice那个类的全名后点击Test Class Loading ,这时候如果你选择的路径是对的,类全名是对的,就可以点next,否则next按钮式灰色的。如图:

    然后点击next,这个界面中的内容基本不用修改,有一个service name ,你可以改成你自己取。

    继续点next 在界面中选择wsdl文件的输出路径,选择第一个,就是输出到当前的workspace,的某个项目下,选择第二个,就是输出到系统文件夹中,例如你可以选择桌面。

    这里我选择第二个,然后点browse选择桌面,点finish,会看到桌面上有一个service.wsdl文件。

    下面我们就可以根据这个wsdl文件生成客户端代码了。

    首先建一个java项目,例如取名myclient

    new -->others-->

    选择第1个,点next.

    在界面中点 browse找到你刚才生成service.wsdl文件。

    点next,这个界面不用管,继续点next

    这个时候需要选择代码生成的地方,选择当前工作的workspace,然后选择刚才新建的myclient如图:

    点finsh,刷新myclient项目会看到src下多了两个java文件:TestServiceCallbackHandler   和 TestServiceStub

    接下来就可以写java代码调用了,如下:

    import myservice.service.TestServiceStub;
    
    public class Test {
    
        /**
         * @param args
         * @throws Exception 
         */
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            //初始化Sub类
            TestServiceStub stub = new TestServiceStub();
            //传递AxisServiceStub.ShowName对象,相关参数在这边赋值。
            TestServiceStub.SayHello command = new TestServiceStub.SayHello();
            command.setName("zhangsan");
            //取得返回值
            String name = stub.sayHello(command).get_return();
            System.out.println(name);
        }
    
    }

    如此,第二种方式就写完了。

    公司几个同事都喜欢第二种。但是,我个人喜欢用第一种。第二种方式如果插件使用熟练的话,很快就可以生产客户端代码,然后测试代码也可以很快写出来。

    注:可能会出现错误,根据我的经历的错误经验,有以下情况:

        1.tomcat端口问题,你打开刚才插架自动生成的TestServiceStub 类 ctrl+f查找 http://localhost,查到后看他后面的端口是多少,是不是8080,?好像生成的就是8080,但是我们的tomcat可能被自己修改过,端口可能不是8080,所以这里你要改这个端口。

        2.spring的注入问题,如果你写的webservice是在spring整合的环境下,可能会报错误,一般是由 spring注入失败,导致xxxService类注入失败。关于这个我下一篇会详细解释。

        3.一切都正常,打断点调试看到方法执行成功了、执行完毕了,但是并没有成功的返回我们要的结果,而是报超时了,这时候,我们需要在TestServiceStub 中加入一行代码

            这行代码的作用是 规定超时时间 是多长,例如你可以设为10分钟。_operationClient.getOptions().setTimeOutInMilliSeconds(600000L);  //600*1000毫秒(10分钟

          我感觉这样设置不合理,但是可以解决这个错误,让你的程序运行成功,看到运行成功返回的结果。才有继续学习的劲头啊。

       

  • 相关阅读:
    Mysql配置文件解析
    Mysql的视图
    Setup和 Hold
    洛谷 P2257
    洛谷 P3455
    洛谷 P1447
    洛谷 P1155
    洛谷 P1262
    洛谷 P4180
    洛谷 P5540
  • 原文地址:https://www.cnblogs.com/demingblog/p/3264688.html
Copyright © 2020-2023  润新知