WebService - Axis2使用services.xml进行开发server与client(未与Spring整合)

简介: WebService - Axis2使用services.xml进行开发server与client(未与Spring整合)

服务端使用services.xml进行开发配置,发布到Tomcat,客户端有三种方式进行开发,使用main方法测试。

【1】环境准备

将axis2.war解压开,将conf,lib(去掉txt),modules,service 四个文件夹复制到已有项目的WEB-INF下。

将lib中的jar Add BuildPath。


【2】开发接口与实现类

接口类如下:

package com.web.Axis2.service;
public interface MyService {
    public String sayHello(String name);
}


实现类如下:

package com.web.Axis2.service.impl;
import com.web.Axis2.service.MyService;
public class MyServiceImpl implements MyService{
    @Override
    public String sayHello(String name) {
        System.out.println("this is service "+name);
        return "hello "+name;
    }
}


【3】配置services.xml

在services文件下新建一个文件夹(任意取名),再新建META-INF文件夹,最后再新增services.xml,接口信息就写在这里面。


具体路径:WEB-INF/services/myservice/META-INF/services.xml 。


【4】发布项目,测试服务端



【5】编写客户端

这里有三种方式:


① 使用wsdl文件(或wsdl的url)生成Stub,进行客户端研发;

② 使用RPC方式,进行service远程调用;

③ 使用document方式。

这里使用第二种方式,更便捷,不用生成Stub。

第二种方式客户端代码如下:

package com.web.client;
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 {
    public static void main(String[] args) {
        String url="http://localhost:8080/Axis2/services/AxisService?wsdl";  
        //调用的方法名
        String method="sayHello";  
        RPCServiceClient serviceClient;  
        try {  
            serviceClient = new RPCServiceClient();  
            Options options = serviceClient.getOptions();  
            EndpointReference targetEPR = new EndpointReference(url);  
            options.setTo(targetEPR);  
            // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值  
             QName opAddEntry = new QName("http://impl.service.Axis2.web.com",method);   
             Object[] opAddEntryArgs = new Object[] {"Tom"};  
             Class[] classes = new Class[] {String.class };  
            // 返回参数类型,这个和axis1有点区别  
             // invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;  
             // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];  
             // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。  
             // 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}  
             // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,  
             // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同  
             Object[] result=serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes);  
             System.out.println(result[0].toString());  
        } catch (AxisFault e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
}

【5】测试webservice

客户端输出结果如下:


服务端输出结果如下:



客户端测试结果如下:


服务端测试结果如下:


【6】第三种Client调用方式(document)

客户端代码如下:

package com.web.client;
import java.util.Iterator;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
public class Client2 {
    /**
     * document方式
     * @param args
     */
    public static void main(String[] args) {
        try {  
              String url="http://localhost:8080/Axis2/services/AxisService?wsdl";  
              Options options = new Options();  
              // 指定调用WebService的URL  
              EndpointReference targetEPR = new EndpointReference(url);  
              options.setTo(targetEPR);  
              options.setAction("http://impl.service.Axis2.web.com/sayHello");  
              ServiceClient sender = new ServiceClient();  
              sender.setOptions(options);  
              OMFactory fac = OMAbstractFactory.getOMFactory();  
              // targetNameSpace
              String tns = "http://impl.service.Axis2.web.com";  
              OMNamespace omNs = fac.createOMNamespace(tns, "");  
              // 接口的方法
              OMElement method = fac.createOMElement("sayHello", omNs);  
              //方法的参数
              OMElement name = fac.createOMElement("name", omNs);  
              //设置参数值
              name.setText("Jane"); 
              method.addChild(name);  
              method.build();  
              OMElement result = sender.sendReceive(method);  
              System.out.println(result);  
              System.out.println("****************************************************************************************************************");
              Iterator in = result.getChildElements();
              while(in.hasNext()){  
                OMElement om = (OMElement)in.next();  
                System.out.println(om.getText());
              }  
            } catch (AxisFault axisFault) {  
              axisFault.printStackTrace();  
            }  
    }
}

【7】第一种Client调用方式(Stub)

配置axis2环境变量(或在DOS下进入axis2bin路径)

AXIS2_HOME=D:\Java_Tomcat_MySQL_jdk_zip\axis2-1.7.6
Path: % AXIS2_HOME%\bin

执行命令如下:

wsdl2java -uri http://localhost:8080/Axis2/services/AxisService?wsdl -p com.web.client -s -o stub

20171104141405502.png


会在bin目录下生成stub文件夹:


将Stub拷入项目,进行使用;客户端代码如下:

package com.web.client;
import com.web.client.AxisServiceStub.SayHello;
import com.web.client.AxisServiceStub.SayHelloResponse;
public class Client3 {
    /**
     * Stub方式
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
         try{  
                AxisServiceStub stub = new AxisServiceStub();  
                SayHello sayHello = new SayHello();
                sayHello.setName("Janus");  
                SayHelloResponse res = stub.sayHello(sayHello); 
                String result = res.get_return();
                System.out.println(result);  
            }catch(Exception ex){  
                ex.printStackTrace();  
            }  
    }
}


【8】关于wsdl2java说明

wsdl2java 用于根据WSDL生成相应的服务端和客户端代码的生成工具。

命令行格式为:

WSDL2Java [options] -uri <url or path> : A url or path to a WSDL

其中常用的options具体如下:

-o <path> : 指定生成代码的输出路径
-a : 生成异步模式的代码
-s : 生成同步模式的代码
-p <pkg> : 指定代码的package名称
-l <languange> : 使用的语言(Java/C) 默认是java
-t : 为代码生成测试用例
-ss : 生成服务端代码 默认不生成
-sd : 生成服务描述文件 services.xml,仅与-ss一同使用
-d <databinding> : 指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri
-g : 生成服务端和客户端的代码
-pn <port_name> : 当WSDL中有多个port时,指定其中一个port
-sn <serv_name> : 选择WSDL中的一个service
-u : 展开data-binding的类
-r <path> : 为代码生成指定一个repository
-ssi : 为服务端实现代码生成接口类
-S : 为生成的源码指定存储路径
-R : 为生成的resources指定存储路径
–noBuildXML : 输出中不生成build.xml文件
–noWSDL : 在resources目录中不生成WSDL文件
–noMessageReceiver : 不生成MessageReceiver类


可以直接指定输出路径到项目下:

wsdl2java -uri http://localhost:8080/Axis2/services/AxisService?wsdl -p com.web.client2 -s -o C:\Users\12746\eclipse\workspace2\Axis2Client\

20171104142228444.png


生成的Stub如下所示:



目录
相关文章
|
9天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
527 6
|
20天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
20天前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
27天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
58 2
|
29天前
|
NoSQL 前端开发 Java
使用 Spring Boot + Neo4j 实现知识图谱功能开发
在数据驱动的时代,知识图谱作为一种强大的信息组织方式,正逐渐在各个领域展现出其独特的价值。本文将围绕使用Spring Boot结合Neo4j图数据库来实现知识图谱功能开发的技术细节进行分享,帮助读者理解并掌握这一技术栈在实际项目中的应用。
100 4
|
1月前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
109 6
|
1月前
|
IDE Java 开发工具
还在为繁琐的配置头疼吗?一文教你如何用 Spring Boot 快速启动,让开发效率飙升,从此告别加班——打造你的首个轻量级应用!
【9月更文挑战第2天】Spring Boot 是一款基于 Spring 框架的简化开发工具包,采用“约定优于配置”的原则,帮助开发者快速创建独立的生产级应用程序。本文将指导您完成首个 Spring Boot 项目的搭建过程,包括环境配置、项目初始化、添加依赖、编写控制器及运行应用。首先需确保 JDK 版本不低于 8,并安装支持 Spring Boot 的现代 IDE,如 IntelliJ IDEA 或 Eclipse。
83 5
|
2月前
|
Java Spring 人工智能
AI 时代浪潮下,Spring 框架异步编程点亮高效开发之路,你还在等什么?
【8月更文挑战第31天】在快节奏的软件开发中,Spring框架通过@Async注解和异步执行器提供了强大的异步编程工具,提升应用性能与用户体验。异步编程如同魔法,使任务在后台执行而不阻塞主线程,保持界面流畅。只需添加@Async注解即可实现方法的异步执行,或通过配置异步执行器来管理线程池,提高系统吞吐量和资源利用率。尽管存在线程安全等问题,但异步编程能显著增强应用的响应性和效率。
32 0
|
2月前
|
Java Spring 开发者
解锁 Spring Boot 自动化配置的黑科技:带你走进一键配置的高效开发新时代,再也不怕繁琐设置!
【8月更文挑战第31天】Spring Boot 的自动化配置机制极大简化了开发流程,使开发者能专注业务逻辑。通过 `@SpringBootApplication` 注解组合,特别是 `@EnableAutoConfiguration`,Spring Boot 可自动激活所需配置。例如,添加 JPA 依赖后,只需在 `application.properties` 配置数据库信息,即可自动完成 JPA 和数据源设置。这一机制基于多种条件注解(如 `@ConditionalOnClass`)实现智能配置。深入理解该机制有助于提升开发效率并更好地解决问题。
49 0
|
2月前
|
Java Spring API
Spring框架与GraphQL的史诗级碰撞:颠覆传统,重塑API开发的未来传奇!
【8月更文挑战第31天】《Spring框架与GraphQL:构建现代API》介绍了如何结合Spring框架与GraphQL构建高效、灵活的API。首先通过引入`spring-boot-starter-data-graphql`等依赖支持GraphQL,然后定义查询和类型,利用`@GraphQLQuery`等注解实现具体功能。Spring的依赖注入和事务管理进一步增强了GraphQL服务的能力。示例展示了从查询到突变的具体实现,证明了Spring与GraphQL结合的强大潜力,适合现代API设计与开发。
55 0
下一篇
无影云桌面