Axis2
分析(
WSDL
文件生成功能)
--report by WFK
关于Axis2
Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持,但它具有更强的灵活性并可扩展到新的体系结构。Axis2由7个独立的模块组成:
信息模型:此模块管理 SOAP 引擎的状态。
XML
处理模型:Axis2 引入了一个名为 AXIOM 的新模型,用于处理 SOAP 消息。
SOAP
处理模型:Axis2 体系结构定义了两个管道(或流),分别称为 InPipe (InFlow) 和 OutPipe (OutFlow),用于处理服务器端的请求消息和响应消息。
部署模块:此模块配置 Axis 引擎并部署服务和模块。
WSDL
和代码生成:此模块从 WSDL 文件中生成客户端存根和服务器框架代码。
客户端 API
:Axis2 客户端 API 调用遵循 WSDL 2.0 定义的 In-Only 和 In-Out 消息模式的操作。
传输:此模块包含与传输层交互的处理程序。
Axis2的WSDL文件生成功能
由上面的介绍可以看出,WSDL文件的生成功能只是Axis2的功能之一,并且此功能模块具有相对独立性,现在就简要的分析一下此模块:
命令行参数的含义:
Usage java2wsdl
:
-cn <fully qualified class name> : class file name
-o <output Location> : output file location
-cp <class path uri> : list of classpath entries - (urls)
-tn <target namespace> : target namespace
-tp <target namespace prefix> : target namespace prefix
-stn <schema target namespace> : target namespace for schema
-stp <schema target namespace prefix> : target namespace prefix for schema
-sn <service name> : service name
-of <output file name> : output file name for the WSDL
-st <binding style> : style for the WSDL
-u <binding use> : use for the WSDL
-l <soap address> : address of the port for the WSDL
解释:
-cn 输入Class名,包含Package的定义。
-cp 输入Class路径名,准确说是Class所在package的路径。
-o 输出路径名,即生成的wsdl文件所在的路径;不指定则为用户的主目录。
-of 输出文件名(不含wsdl后缀),没有定义,则以类名命名。
-tn 设置targetNamespace
Axis配置:
以下是WSDL命名空间的配置:
Java2WSDLConstants
接口数据项与生成的
WSDL
文件命名空间的对应关系。
解释:在Java2WSDLConstants接口参数与WSDL文件的对应关系:
DEFAULT_TARGET_NAMESPACE
对应
targetNamespace
WSDL_NAMESPACE
对应
xmlns:wsdl
URI_WSDL12_SOAP
对应
xmlns:soap12
HTTP_NAMESPACE
对应
xmlns:http
。。。。。 以上是各命名空间定义的设置,不再一一解释。
注:在上图中Java2WSDLConstants的参数并非全是命名空间。比如DEFAULT_LOCATION_URL即为Service的访问地址。
以下是元素名、属性值的配置:
各参数的解释:不再一一解释,这里只是说明命名的规律:
l 以”LOCAL_NAME”为结尾的参数用来约束XML文档的元素名,而前面字母代表具体含义。例如:String IN_PUT_LOCAL_NAME = "input";则生成的文档WSDL文档为(prot中的input定义项):
l 以:”_SUFFIX”为结尾的参数,用来定义数据项名称,表示一个元素应该以此为结尾。例如String MESSAGE_SUFFIX = "Message";则对于toString方法,则有:
其实从这里可以看出Axis2不支持重载函数的原因。
l 以” _PREFIX”结尾的参数,用来描述数据值,参照上面的解释,这个应该是放在前面。
l 其余的各个参数,其值均可在WSDL文档中找到,而有些只是默认值,即如果在命令行中有设置,则此参数无效。此类参数多数以” DEFAULT_”为开始命名。
配置小结:
可以根据Java2WSDLConstants接口参数来配置WSDL文档的命名空间、元素名、数据项名称等;并且很多功能都可以通过命令行参数来设置。但是这里面没有我们所期待功能:对方法进行有选择性的描述。
Axis2“选择性接口描述”实现方案
源码分析:
代码位于_java2wsdl文件夹内,代码结构比较清晰。
l 首先,用Java2WSDLCommandLineOptionParser类来解析命令行参数,生成一个由参数名(String)和参数内容列表(List)构成的Map。
ü 用isInvalid方法(Java2WSDLOptionsValidator类)来检测参数的合法性。返回不合法的参数列表。
ü 在Java2WSDLCodegenEngine内分析参数,并根据类路径参数生成ClassLoader,根据输出路径生成文件的输出句柄。用类名、CalssLoader、输出句柄实例化Java2WSDLBuilder类,并将各个参数传入。
ü Java2WSDLBuilder类调用generateWSDL方法。
ü 生成SchemaGenerator类,主要用于处理各种参数,并生成WSDL相关参数。
ü
在SchemaGenerator
类的generateSchema
方法里,通过反射机制得到被解析类的方法数组。并在这里进行解析、过滤,去除非public
方法,如果有重复的方法名(overload
),则程序报错。
l 将经过SchemaGenerator类处理后的数据取出,初始化Java2OMBuilder类,并由其生成WSDL文档。
l 文件关闭处理,主程序返回,结束。
实现方案
l 通过源码分析可知,我们只需要
将我们所需要的方法名以一定的方式传入程序,在程序内对方法集过滤,如此我们便可得到所需要的方法集。
l 假设,我们是用命令行传参数的方法实现我们所需的功能。那么,在
源码分析中用勾来标注的地方就是需要我们进行修改。
l
重点是修改红色标注部分。
设计实现
实现了上述方案,在命令行参数里加入了一个新选项(-ml <method-name list to show> : methods you want to show in the WSDL file);如果你只想让某两个方法(例如,toString 和 foo 方法),你只需要加入命令行描述(-ml toString foo)即可。
在所有改动的地方,均标注://ADD BY WFK
问题
没有改动的版本存在一定的问题。例如:
在
WSDL
文件的
portType
和
binding
元素里面,并没有去掉非
public
方法,而是将其一同描述;而其指向的message元素并不存在。(这应该是不正确的,但是本人对WSDL了解不深刻,并不敢断言)。
在改动后,非public方法在WSDL任何地方都消失的无影无踪。