服务端:
服务端生成命令:见后面
代码接口需要自己实现:后缀为Skeleton的类需要自己实现
所需jar
改动:需要改services.xml里的useOriginalwsdl为false,或将wsdl放在同级目录
各文件防止位置
web.xml:
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
services.xml放在eams/WEB-INF\services\webservice\META-INF下
wsdl文件访问路径
路径说明:ip:端口/项目名/services(可能是对应services.xml路径)/services.xml中定义的service的name?wsdl
客户端:
wsdl2java -uri C:\xxx.wsdl -p com.kk.proj.service.product -o stub
uri参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。
p参数指定了生成的Java类的包名,
o参数指定了文件保存的目录。
---------------------------------------------------------------------------------------------------------------
一、利用Axis2工具的WSDL2Java命令自动生成JAVA代码,进入cmd命令行模式,运行命令WSDL2Java
1.生成服务端代码命令
WSDL2Java -uri wsdl文件全路径 -p 包名 -d xmlbeans -s -ss -sd -ssi -o 生成的java代码存放路径
2.生成客户端包代码命令
WSDL2Java -uri wsdl文件全路径 -p 包名 -d xmlbeans -s -o 生成的java代码存放路径
WSDL2Java命令参数说明:
-uri 指定*.wsdl文件,可以带具体路径;
-p 指定生成代码的包名
-d xmlbeans 使用不同的数据绑定方法,默认adb;
adb:最简单的生成Axis客户端的方法。大部分情况下,这些主要的类都会以内部类的形式创建在stub类中。It is not meant to be a full schema binding application, and has difficulty with structures such as XML Schema element extensions and restrictions。 be meant to:有意要、打算
xmlbeans : 与adb不同,他是一个全功能的schema编译器。他没有ADB的限制。然而,他也比ADB用起来更复杂。他会产成大量的文件,编程模型不如adb直观。
JiBX:他是一个数据绑定框架。他不仅提供了WSDL-JAVA的转换,而且提供了JAVA-XML的转换。JiBX相当灵活,允许你选择类来代表你的实体,但是这个却不好做,但还句话说,如果这些都能建好,那么使用JiBX就更使用ADB一样容易。
对于简单应用来说adb已经够用了,如果想用更加强大更加灵活的功能,那么你可能需要使用其他两种方式。
-o 指定生成代码放置的路径;
-ss 表示要生成服务端代码;
-ssi 表示要生成代码中,先生成接口类,再生成实现类;
-----------------------------------------------------------------------------------------------------------
命令行格式为: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类
------------------------------------------------------------------------------------------axis客户端代码
-------------1、所需jar包
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis-jaxrpc</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.2</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
-------------2、代码
//以下代码需要新增jar:axis-jaxrpc-1.4.jar、commons-discovery-0.2.jar、axis2-xmlbeans-1.8.0.jar
public static void main(String[] args) throws Exception{
String en="http://127.0.0.1:8080/TestWebservice/services/AppframeUserService";//wsdl地址
String targetNamespace="http://www.openuri.org/";//搜索wsdl文件中的targetNamespace
// String soapActionURI = "http://WebXml.com.cn/getCountryCityByIp";//搜索wsld文件中此方法的soapactionuri,如果没有uri可以不设置
String method = "getUserSet";//要调用的方法名(以wsdl文件为准)
Object[] ps=new Object[] {"<condition><CompanyCode>221112</CompanyCode><name>公司</name></condition>"};//参数值,顺序与参数名对应
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(en);
call.setOperationName(new javax.xml.namespace.QName(targetNamespace,method));
// call.setSOAPActionURI(soapActionURI);
// call.setUseSOAPAction(true);//如果有soapActionURI,设置为true(此处未测试)
call.setEncodingStyle("UTF-8");
call.addParameter(new javax.xml.namespace.QName(targetNamespace,"xmlData"),
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN); //此处设置参数名,多个参数可以多次调用该方法,与参数值对应
// call.addParameter(new javax.xml.namespace.QName(targetNamespace,"name"),
// org.apache.axis.encoding.XMLType.XSD_STRING,
// javax.xml.rpc.ParameterMode.IN);
call.setReturnClass(String.class);//返回值类型,根据实际返回值类型设置
Object resp = call.invoke(ps);
System.out.println(resp);
}
-------------3、其他
如果报错Unexpected subelement,可能是传入了不被期望的参数,检查参数名和targetNamespace是否正确,如果参数名没问题,可以把targetNamespace改成wsdl文件中其他相似地址试试。