• axis2学习笔记


    本篇内容参考地址,感谢大佬
    原文地址

    1. 下载axis的war包下载地址
    2. 将下载好的war包部署到tomcat
    3. 使用方法
      1. 第一种

        1. 创建一个java类
        public class SimpleService
        {
            public String getGreeting(String name)
            {
                System.out.println(name);
                return "hello===== " + name;
            }    
            public int getPrice()
            {
                return new java.util.Random().nextInt(1000);
            }    
        }
        
        1. 编译java类,将编译好的class文件放在apache-tomcat-8.5.58webappsaxis2WEB-INFpojo下,pojo文件夹没有就创建
        2. 修改或添加默认的pojo文件夹-->apache-tomcat-8.5.58webappsaxis2WEB-INFconf--><deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/>
        3. 修改热部署或热更新
          <parameter name="hotdeployment">true</parameter>`` <parameter name="hotupdate">true</parameter>
      2. 第二种

        1. 创建一个基本的maven项目,添加依赖
      org.apache.axis2 axis2-adb 1.7.9 ``` 2. 在resource下创建文件夹`META-INF`,在该文件夹创建services.xml内容参考 ```xml <--多个使用serviceGroup在外面包围--> 测试 cn.jaminye.HelloWorld ```
    import javax.jws.WebParam;
    
       /**
        * 测试
        *
           * @author Jamin
           * @date 2021/1/5 9:05
           */
          public class HelloWorld {
       	/**
       	 * 无返回值
    			 *
    			 * @param message
    			 * @author Jamin
    			 * @date 2021/1/5 9:16
    			 */
    			public void testHello(@WebParam String message) {
    				System.out.println(message);
    			}
    		
    		
    			/**
    			 * 有返回值
    			 *
    			 * @param x
    			 * @param y
    			 * @return {@link int}
    			 * @author Jamin
    			 * @date 2021/1/5 9:15
    			 */
    			public int plus(@WebParam int x, @WebParam int y) {
    				return x + y;
    			}
    		}
    
    	3. 将项目打成jar包放在`apache-tomcat-8.5.58webappsaxis2WEB-INFservices`
    
    1. 启动tomcat,打开http://localhost:8080/axis2/services/listServices查看所有服务

    2. 点击查看该服务的wsdl文件说明书

    3. 输入http://localhost:8080/axis2/services/HelloWorld/plus?x=1&y=2查看返回的xml数据

    4. 代码调用

      1. 第一种rpc调用

        // 使用rpc的方式调用   无返回值
        Options options1 = rpcServiceClient.getOptions();
        //地址
        options1.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld/testHello"));
        //参数
        Object[] inArgs1 = {"测试"};
        //命名空间
        QName qName1 = new QName("http://jaminye.cn", "testHello");
        rpcServiceClient.invokeRobust(qName1, inArgs1);
        
        //使用rpc的方式调用    有返回值
        RPCServiceClient rpcServiceClient = new RPCServiceClient();
        Options options = rpcServiceClient.getOptions();
        //指定调用地址
        options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld"));
        //指定入参与出参类型
        Object[] inArgs = {1, 2};
        Class[] classes = {String.class};
        QName qName = new QName("http://jaminye.cn", "plus");
        System.out.println(rpcServiceClient.invokeBlocking(qName, inArgs, classes)[0]);
        
      2. 第二种 根据入参

        //无返回值调用
        ServiceClient serviceClient = new ServiceClient();
        Options options = serviceClient.getOptions();
        options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld"));
        options.setAction("http://jaminye.cn/HelloWorld");
        OMFactory omFactory = OMAbstractFactory.getOMFactory();
        OMNamespace omNamespace = omFactory.createOMNamespace("http://jaminye.cn", "");
        OMElement method = omFactory.createOMElement("testHello", omNamespace);
        OMElement paramsName = omFactory.createOMElement("message", omNamespace);
        paramsName.setText("测试");
        method.addChild(paramsName);
        method.build();
        serviceClient.sendRobust(method);
        //有返回值调用
        ServiceClient serviceClient = new ServiceClient();
        Options options = serviceClient.getOptions();
        options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld"));
        options.setAction("http://jaminye.cn/HelloWorld");
        OMFactory omFactory = OMAbstractFactory.getOMFactory();
        OMNamespace omNamespace = omFactory.createOMNamespace("http://jaminye.cn", "");
        OMElement method = omFactory.createOMElement("plus", omNamespace);
        OMElement paramsX = omFactory.createOMElement("x", omNamespace);
        paramsX.setText("1");
        OMElement paramsY = omFactory.createOMElement("y", omNamespace);
        paramsY.setText("2");
        method.addChild(paramsX);
        method.addChild(paramsY);
        method.build();
        OMElement result = serviceClient.sendReceive(method);
        //返回原来的xml
        System.out.println(result);
        //获取真正的返回值
        System.out.println(result.getFirstElement().getText());
        
      3. 复合数据类型

        /**
        	 * 上传字节
        	 *
        	 * @param imageByte
        	 * @return {@link boolean}
        	 * @author Jamin
        	 * @date 2021/1/14 9:33
        	 */
        	public boolean uploadImageWithByte(byte[] imageByte) {
        		FileOutputStream fileOutputStream = null;
        		try {
        			fileOutputStream = new FileOutputStream("d:\1.jpeg");
        			fileOutputStream.write(imageByte, 0, imageByte.length);
        		} catch (IOException e) {
        			e.printStackTrace();
        			return false;
        		} finally {
        			if (fileOutputStream != null) {
        				try {
        					fileOutputStream.close();
        				} catch (IOException e) {
        					e.printStackTrace();
        					return false;
        				}
        			}
        		}
        
        		return false;
        	}
        
        	/**
        	 * 无参返回数组
        	 *
        	 * @param
        	 * @return {@link String[]}
        	 * @author Jamin
        	 * @date 2021/1/19 15:46
        	 */
        	public String[] returnArray() {
        		String[] strings = {"1", "2", "3", "4"};
        		return strings;
        	}
        
        	/**
        	 * 返回一个对象
        	 *
        	 * @param
        	 * @return {@link cn.jaminye.HelloWorld.Person}
        	 * @author Jamin
        	 * @date 2021/1/19 15:49
        	 */
        	public Person returnPerson() {
        		return new Person("1", "测试", "13");
        	}
        
        	/**
        	 * 返回对象字节数组
        	 *
        	 * @param
        	 * @return {@link byte[]}
        	 * @author Jamin
        	 * @date 2021/1/19 15:56
        	 */
        	public byte[] returnBytes() throws IOException {
        		ByteArrayOutputStream bos = new ByteArrayOutputStream();
        		ObjectOutputStream oos = new ObjectOutputStream(bos);
        		Person person = new Person("1", "测试", "13");
        		oos.writeObject(person);
        		return bos.toByteArray();
        	}
        
        	public class Person  implements Serializable{
        		/**
        		 * id
        		 */
        		private String id;
        		/**
        		 * name
        		 */
        		private String name;
        		/**
        		 * age
        		 */
        		private String age;
        
        		public Person(String id, String name, String age) {
        			this.id = id;
        			this.name = name;
        			this.age = age;
        		}
        
        		public String getId() {
        			return id;
        		}
        
        		public void setId(String id) {
        			this.id = id;
        		}
        
        		public String getName() {
        			return name;
        		}
        
        		public void setName(String name) {
        			this.name = name;
        		}
        
        		public String getAge() {
        			return age;
        		}
        
        		public void setAge(String age) {
        			this.age = age;
        		}
        	}
        
        org.apache.axis2.AxisFault: cn.jaminye.Person
        Caused by: java.lang.InstantiationException: cn.jaminye.Person
        Caused by: java.lang.NoSuchMethodException: cn.jaminye.Person.<init>()
         实体类没有无参构造方法
        
         /**
         * 字节数组入参
         *
         * @throws IOException
         */
         @Test
         public void testArray() throws IOException {
         RPCServiceClient rpcServiceClient = new RPCServiceClient();
         Options options = rpcServiceClient.getOptions();
         //指定调用地址
         options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld"));
         new File("d:\1.jpeg").createNewFile();
         File file = new File("D:\Windows\Pictures\Camera Roll\2.jpg");
         FileInputStream fis = new FileInputStream(file);
         byte[] bytes = new byte[(int) file.length()];
         fis.read(bytes);
         System.out.println("文件长度====" + file.length());
        

      Object[] inArgs = {bytes};
      Class[] classes = {Boolean.class};
      QName qName = new QName("http://jaminye.cn", "uploadImageWithByte");
      fis.close();
      System.out.println(rpcServiceClient.invokeBlocking(qName, inArgs, classes)[0]);
      }

      	/**
      	 * 返回对象
      	 * @throws AxisFault
      	 */
      	@Test
      	public void testPerson() throws AxisFault {
      		RPCServiceClient rpcServiceClient = new RPCServiceClient();
      		Options options = rpcServiceClient.getOptions();
      		//指定调用地址
      		options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld"));
      		Object[] inArgs = {};
      		Class[] classes = {Person.class};
      		QName qName = new QName("http://jaminye.cn", "returnPerson");
      		System.out.println((Person) rpcServiceClient.invokeBlocking(qName, inArgs, classes)[0]);
      	}
      /**
       * 返回对象
      *
      * @throws AxisFault
      */
      @Test
      public void testPerson() throws AxisFault {
       
      	RPCServiceClient rpcServiceClient = new RPCServiceClient();
      	Options options = rpcServiceClient.getOptions();
      	//指定调用地址
      	options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld"));
      	Object[] inArgs = {};
      	Class[] classes = {Person.class};
      	QName qName = new QName("http://jaminye.cn", "returnPerson");
      	System.out.println((Person) rpcServiceClient.invokeBlocking(qName, inArgs, classes)[0]);
      	}
      /**
       * 返回字节数组对象
       *对象需要实现序列化接口
       * @param
       * @author Jamin
       * @date 2021/1/27 8:48
       */
      @Test
      void testBytes() throws IOException, ClassNotFoundException {
          RPCServiceClient rpcServiceClient = new RPCServiceClient();
          Options options = rpcServiceClient.getOptions();
          options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld"));
          QName qName = new QName("http://jaminye.cn", "returnBytes");
          Class[] classes = {byte[].class};
          byte[] bytes = (byte[]) rpcServiceClient.invokeBlocking(qName, new Object[]{}, classes)[0];
          ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
          Person person = (Person) ois.readObject();
          System.out.println(person.toString());
      }
      ```
      
    5. 作用域详细信息

      1. request 请求域
      2. soapsession
      3. TransportSession 会话域 不加managesession 和request差不多 加上和TransportSession
      4. Application 应用域
    6. 获取与保存当前作用域信息

      MessageContext messageContext=MessageContext.getCurrentMessageContext();         ServiceContext sc = messageContext.getServiceContext(); 
      //保存值
      Object previousValue = sc.setProperty("VALUE");
      //获取值
      Object previousValue = sc.getProperty("VALUE");
      
    7. 跨服务获取信息

      1. 将值保存在ServiceGroupContext/ServiceContext
      2. 作用域改为application
      3. 调用ServiceContext需要开启session管理
    8. 异步调用

      rpcServiceClient = new RPCServiceClient();
      	Options options = rpcServiceClient.getOptions();
      	options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloWorld"));
      	options.setManageSession(true);
      	QName qName = new QName("http://jaminye.cn", "asynchronousCall");
      	//异步调用
      	rpcServiceClient.invokeNonBlocking(qName, new Object[]{}, new AxisCallback() {
      		//异步处理
      		@Override
      		public void onMessage(MessageContext msgContext) {
      

    System.out.println(msgContext.getEnvelope().getBody().getFirstElement().getFirstElement().getText());
    }
    @Override
    public void onFault(MessageContext msgContext) {
    System.out.println("onFault");
    }
    @Override
    public void onError(Exception e) {
    System.out.println(e);
    }
    @Override
    public void onComplete() {
    }
    });
    System.out.println("结束==========>");
    System.in.read();
    ```

    1. 自定义模块 LoggingModule
      1. 编写module类 实现org.apache.axis2.modules.Module接口
        主要方法为init方法
      public class LoggingModule implements Module {
      @Override
      public void init(ConfigurationContext configContext, AxisModule module) throws AxisFault {
      	System.out.println("======================>init");
      }
      
      @Override
      public void engageNotify(AxisDescription axisDescription) throws AxisFault {
      
      }
      
      @Override
      public boolean canSupportAssertion(Assertion assertion) {
      	return false;
      }
      
      @Override
      public void applyPolicy(Policy policy, AxisDescription axisDescription) throws AxisFault {
      
      }
      
      @Override
      public void shutdown(ConfigurationContext configurationContext) throws AxisFault {
      	System.out.println("=========================shutdown");
      }
      

    }
    2. 编写LogHandler类继承org.apache.axis2.handlers.AbstractHandler 实现org.apache.axis2.engine.Handler java
    public class LogHandler extends AbstractHandler implements Handler {
    private static Log log = LogFactory.getLog(LogHandler.class);

    @Override
    public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
    	log.info("returnMsg====================>{}" + msgContext.getEnvelope().toString());
    	return InvocationResponse.CONTINUE;
    }
    

    }
    3. 在resource创建module.xml xml













    <OutFaultFlow>
        <handler name="FaultOutFlowLogHandler" class="cn.jaminye.util.LogHandler">
            <order phase="loggingPhase"/>
        </handler>
    </OutFaultFlow>
    <InFaultFlow>
        <handler name="FaultInFlowLogHandler" class="cn.jaminye.util.LogHandler">
            <order phase="loggingPhase"/>
        </handler>
    </InFaultFlow>
    
    ``` 4. 带依赖打包,改为mar结尾,放在axis2WEB-INFmodules目录下 5. webappsaxis2WEB-INFconf下axis2.xml [InFlow,OutFlow,InFaultFlow,OutFaultFlow] 末尾加上`` 6. 需要使用的服务中添加
    作者: JaminYe
    版权声明:本文原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
  • 相关阅读:
    sublime text 4 vim 插件配置
    ssh-keygen 的使用
    distribution transaction solution
    bilibili 大数据 视频下载 you-get
    Deepin 20.2.1 安装 MS SQL 2019 容器版本
    【转】使用Linux下Docker部署MSSQL并加载主机目录下的数据库
    【转】You Can Now Use OneDrive in Linux Natively Thanks to Insync
    dotnet 诊断工具安装命令
    Linux 使用 xrandr 设置屏幕分辨率
    【转】CentOS 7.9 2009 ISO 官方原版镜像下载
  • 原文地址:https://www.cnblogs.com/JaminYe/p/14378446.html
Copyright © 2020-2023  润新知