浏览 9020 次
锁定老帖子 主题:使用 WSDL4J 创建 WSDL
精华帖 (0) :: 良好帖 (1) :: 新手帖 (7) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-07
最后修改:2009-07-07
使用 WSDL4J 创建 WSDL
WSDL4J : WSDL For JAVA Toolkit, 顾名思义,是一个解析和创建WSDL的 JAVA类库(工具包)。
用WSDL4J来解析WSDL的例子比较多,这里不再赘述, 但用WSDL4J来创建WSDL的例子却很少,前几天根本没找到这方面的例子, 好不容易找到一个 还是在 JSR 110(Java APIs for WSDL) 的官方文档上看到的, 看来使用WSDL4J来创建WSDL 的情况比较少, 在开发 Web Service 框架 的时候可能会用到。
使用 WSDL4J 来创建 WSDL 并没有想象中的那么美!!! 下面是一个示例,在本人认为 容易出错 或 容易困惑 的地方做了一些注释。
public class CreateWsdl { public static void main(String[] args) throws WSDLException{ String tns = "http://test.org/Hello"; String xsd = "http://www.w3.org/2001/XMLSchema"; WSDLFactory wsdlFactory = WSDLFactory.newInstance(); // 创建一个 WSDL definition Definition definition = wsdlFactory.newDefinition(); // 设置 targetNamespace definition.setTargetNamespace(tns); definition.setQName(new QName(tns,"Hello")); // 添加命名空间 (一些常用的命名空间) definition.addNamespace("tns", tns); definition.addNamespace("xsd", xsd); definition.addNamespace("wsdlsoap", "http://schemas.xmlsoap.org/wsdl/soap/"); definition.addNamespace("soapenc11", "http://schemas.xmlsoap.org/soap/encoding/"); definition.addNamespace("soapenc12", "http://www.w3.org/2003/05/soap-encoding"); definition.addNamespace("soap11", "http://schemas.xmlsoap.org/soap/envelope/"); definition.addNamespace("soap12", "http://www.w3.org/2003/05/soap-envelope"); //创建 Part Part part1 = definition.createPart(); part1.setName("part"); //设置 part1 的 Schema Type 为 xsd:string part1.setTypeName(new QName(xsd,"string")); Part part2 = definition.createPart(); part2.setName("part"); //设置 part2 的 Schema Type 为 xsd:string part2.setTypeName(new QName(xsd,"string")); //创建消息(Message) Message message1 = definition.createMessage(); message1.setQName(new QName(tns,"helloRequest")); //为 message 添加 Part message1.addPart(part1); message1.setUndefined(false); Message message2 = definition.createMessage(); message2.setQName(new QName(tns,"helloResponse")); message2.addPart(part2); message2.setUndefined(false); definition.addMessage(message1); definition.addMessage(message2); //创建 portType PortType portType = definition.createPortType(); portType.setQName(new QName(tns,"helloPortType")); //创建 Operation Operation operation = definition.createOperation(); operation.setName("hello"); //创建 Input,并设置 Input 的 message Input input = definition.createInput(); input.setName("helloRequest"); input.setMessage(message1); //创建 Output,并设置 Output 的 message Output output = definition.createOutput(); output.setName("helloResponse"); output.setMessage(message2); //设置 Operation 的输入,输出,操作类型 operation.setInput(input); operation.setOutput(output); operation.setStyle(OperationType.REQUEST_RESPONSE); //这行语句很重要 ! operation.setUndefined(false); portType.addOperation(operation); portType.setUndefined(false); definition.addPortType(portType); //创建绑定(binding) Binding binding = definition.createBinding(); binding.setQName(new QName(tns,"helloHttpBinding")); //创建SOAP绑定(SOAP binding) SOAPBinding soapBinding = new SOAPBindingImpl(); //设置 style = "document" soapBinding.setStyle("document"); //设置 SOAP传输协议 为 HTTP soapBinding.setTransportURI("http://schemas.xmlsoap.org/soap/http"); //soapBinding 是 WSDL 中的扩展元素, //为 binding 添加扩展元素 soapBinding binding.addExtensibilityElement(soapBinding); //设置绑定的端口类型 binding.setPortType(portType); //创建绑定操作(Binding Operation) BindingOperation bindingOperation = definition.createBindingOperation(); //创建 bindingInput BindingInput bindingInput = definition.createBindingInput(); bindingInput.setName("helloRequest"); //创建 SOAP body ,设置 use = "literal" SOAPBody soapBody1 = new SOAPBodyImpl(); soapBody1.setUse("literal"); bindingInput.addExtensibilityElement(soapBody1); BindingOutput bindingOutput = definition.createBindingOutput(); bindingOutput.setName("helloResponse"); SOAPBody soapBody2 = new SOAPBodyImpl(); soapBody2.setUse("literal"); bindingOutput.addExtensibilityElement(soapBody2); //设置 bindingOperation 的名称,绑定输入 和 绑定输出 bindingOperation.setName("hello"); bindingOperation.setBindingInput(bindingInput); bindingOperation.setBindingOutput(bindingOutput); binding.addBindingOperation(bindingOperation); //这行语句很重要 ! binding.setUndefined(false); definition.addBinding(binding); //创建 service Service service = definition.createService(); service.setQName(new QName(tns,"helloService")); //创建服务端口 port Port port = definition.createPort(); //设置服务端口的 binding,名称,并添加SOAP地址 port.setBinding(binding); port.setName("helloHttpPort"); SOAPAddress soapAddress = new SOAPAddressImpl(); soapAddress.setLocationURI("http://test.org/services/hello"); port.addExtensibilityElement(soapAddress); service.addPort(port); definition.addService(service); //打印刚创建的 WSDL WSDLWriter wirter = wsdlFactory.newWSDLWriter(); wirter.writeWSDL(definition, System.out); } } 输出如下:
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions name="Hello" targetNamespace="http://test.org/Hello" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://test.org/Hello" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <wsdl:message name="helloResponse"> <wsdl:part name="part" type="xsd:string"> </wsdl:part> </wsdl:message> <wsdl:message name="helloRequest"> <wsdl:part name="part" type="xsd:string"> </wsdl:part> </wsdl:message> <wsdl:portType name="helloPortType"> <wsdl:operation name="hello"> <wsdl:input name="helloRequest" message="tns:helloRequest"> </wsdl:input> <wsdl:output name="helloResponse" message="tns:helloResponse"> </wsdl:output> </wsdl:operation> </wsdl:portType> <wsdl:binding name="helloHttpBinding" type="tns:helloPortType"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="hello"> <wsdl:input name="helloRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> <wsdl:output name="helloResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="helloService"> <wsdl:port name="helloHttpPort" binding="tns:helloHttpBinding"> <wsdlsoap:address location="http://test.org/services/hello"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-08
曾经用wsdl4j解析过wsdl
没用它创建过, 自动创建wsdl的情况应该很少 axis,xfire,cxf 这些框架应该用到了这种功能 |
|
返回顶楼 | |
发表时间:2009-07-08
whatwhat 写道 曾经用wsdl4j解析过wsdl
没用它创建过, 自动创建wsdl的情况应该很少 axis,xfire,cxf 这些框架应该用到了这种功能 恩,确实很少用到 java 的一些 web service 框架 应该都用到了这种功能 |
|
返回顶楼 | |
发表时间:2009-08-20
请问一下,自己创建WSDL的意义何在??
|
|
返回顶楼 | |
发表时间:2009-08-20
641216927 写道 请问一下,自己创建WSDL的意义何在??
在开发 Web Service 框架 的时候可能会用到 |
|
返回顶楼 | |
发表时间:2010-03-05
用AXIS根据WSDL生成代码,需要用到WSDL.
没有WSDL,WS就没办法工作. |
|
返回顶楼 | |