论坛首页 Java企业应用论坛

使用 WSDL4J 创建 WSDL

浏览 8960 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-07   最后修改:2009-07-07
SOA

使用 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>
 

 

   发表时间:2009-07-08  
曾经用wsdl4j解析过wsdl
没用它创建过,
自动创建wsdl的情况应该很少
axis,xfire,cxf 这些框架应该用到了这种功能
0 请登录后投票
   发表时间:2009-07-08  
whatwhat 写道
曾经用wsdl4j解析过wsdl
没用它创建过,
自动创建wsdl的情况应该很少
axis,xfire,cxf 这些框架应该用到了这种功能

恩,确实很少用到
java 的一些 web service 框架 应该都用到了这种功能
0 请登录后投票
   发表时间:2009-08-20  
请问一下,自己创建WSDL的意义何在??
0 请登录后投票
   发表时间:2009-08-20  
641216927 写道
请问一下,自己创建WSDL的意义何在??

在开发 Web Service 框架 的时候可能会用到
0 请登录后投票
   发表时间:2010-03-05  
用AXIS根据WSDL生成代码,需要用到WSDL.
没有WSDL,WS就没办法工作.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics