契约优先方式编写wsdl + 隐式Header

hello.wsdl

第一步:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:tns="http://www.example.org/hello/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	name="HelloService"
	targetNamespace="http://www.example.org/hello/">
	<wsdl:types>
		<xsd:schema targetNamespace="http://www.example.org/hello/">
			<xsd:element name="add" type="tns:add"></xsd:element>
			<xsd:element name="addResponse" type="tns:addResponse"></xsd:element>
			<xsd:element name="licenceInfo" type="tns:licenceInfo"></xsd:element>

			<xsd:complexType name="add">
				<xsd:sequence>
					<xsd:element name="a" type="xsd:int"></xsd:element>
					<xsd:element name="b" type="xsd:int"></xsd:element>
				</xsd:sequence>
			</xsd:complexType>
			
			<xsd:complexType name="addResponse">
				<xsd:sequence>
					<xsd:element name="addResponse" type="xsd:int"></xsd:element>
				</xsd:sequence>
			</xsd:complexType>
			
			
			<xsd:complexType name="licenceInfo">
				<xsd:sequence>
					<xsd:element name="licenceInfo" type="xsd:string"></xsd:element>
				</xsd:sequence>
			</xsd:complexType>

		</xsd:schema>
	</wsdl:types>

	<wsdl:message name="add">
		<wsdl:part name="add" element="tns:add"></wsdl:part>
	</wsdl:message>

	<wsdl:message name="addResponse">
		<wsdl:part name="addResponse" element="tns:addResponse"></wsdl:part>
	</wsdl:message>

	<wsdl:message name="licenceInfo">
		<wsdl:part name="licenceInfo" element="tns:licenceInfo"></wsdl:part>
	</wsdl:message>

	<wsdl:portType name="Hello">
		<wsdl:operation name="add">
			<wsdl:input message="tns:add"></wsdl:input>
			<wsdl:output message="tns:addResponse"></wsdl:output>
		</wsdl:operation>
	</wsdl:portType>


	<wsdl:binding name="HelloService" type="tns:Hello">
		<soap:binding style="document"
			transport="http://schemas.xmlsoap.org/soap/http" />
		<wsdl:operation name="add">
			<wsdl:input>
				<soap:body use="literal" />
				<soap:header use="literal" part="licenceInfo" message="tns:licenceInfo"></soap:header>
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>

	<wsdl:service name="HelloService">
		<wsdl:port binding="tns:HelloService" name="HelloServicePort">
			<soap:address location="http://localhost:8080/hello" />
		</wsdl:port>
	</wsdl:service>
</wsdl:definitions>

第二步:

通过wsimport  生成 java文件

将生成的java类文件复制到项目中。


第三步:

修改Hello接口文件。

package org.example.hello;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.1 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebService(name = "Hello", targetNamespace = "http://www.example.org/hello/")
@XmlSeeAlso({
    ObjectFactory.class
})
public interface Hello {


    /**
     * 
     * @param b
     * @param a
     * @return
     *     returns int
     */
    @WebMethod
    @WebResult(name = "addResponse", targetNamespace = "")
    @RequestWrapper(localName = "add", targetNamespace = "http://www.example.org/hello/", className = "org.example.hello.Add")
    @ResponseWrapper(localName = "addResponse", targetNamespace = "http://www.example.org/hello/", className = "org.example.hello.AddResponse")
    public int add(
        @WebParam(name = "a", targetNamespace = "")
        int a,
        @WebParam(name = "b", targetNamespace = "")
        int b , 
        @WebParam(name="licenceInfo" , header=true) String licenceInfo);

}


第四步:

编写HelloServiceImil类 实现Hello接口

@WebService(endpointInterface = "org.example.hello.Hello", 
serviceName = "HelloService" , wsdlLocation = "META-INF/wsdl/hello.wsdl" ,  
targetNamespace = "http://www.example.org/hello/" , portName="HelloServicePort")
public class HelloServiceImpl implements Hello {

	@Override
	public int add(int a, int b, String licenceInfo) {
		System.out.printf("%d + %d = %d\n" , a , b , a+b);
		System.out.println("licenceInfo:" + licenceInfo );
		return a + b;
	}

}


第五步:

发布service

package com.zf.test;

import javax.xml.ws.Endpoint;

import org.example.hello.HelloServiceImpl;

public class ServiceTest {
	
	public static void main(String[] args) {
		
		Endpoint.publish("http://localhost:8080/hello", new HelloServiceImpl());
		
	}

}


第六步:编写客户端。

首先将wsimort生成的java类添加到客户端。


1)、 普通方式访问。(没有头信息)

package com.zf.test;


import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import org.example.hello.Hello;

public class Client01 {

	public static void main(String[] args) throws Exception{
		URL url = new URL("http://localhost:8888/hello?wsdl");
		String namespace = "http://www.example.org/hello/";
		QName sname = new QName(namespace , "HelloService");
		Service service = Service.create(url, sname);
		Hello hello = service.getPort(Hello.class);
		int result = hello.add(1, 100)	;
		System.out.println(result);
	}

}

2)、SOAPMessage方式访问 。 (有头信息)

package com.zf.test;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;



public class Client02 {

	/**
	 * 带Header的请求
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception{
		URL url = new URL("http://localhost:8888/hello?wsdl");
		String namespace = "http://www.example.org/hello/";
		QName sname = new QName(namespace , "HelloService");
		Service service = Service.create(url, sname);
		QName protName = new QName(namespace , "HelloServicePort");
		Dispatch<SOAPMessage> dispatch = service.createDispatch
				( protName , SOAPMessage.class, Service.Mode.MESSAGE);
		
		SOAPMessage msg = MessageFactory.newInstance().createMessage() ;
		SOAPEnvelope env = msg.getSOAPPart().getEnvelope() ;
		SOAPBody body = env.getBody() ;
		SOAPHeader header = env.getHeader() ;
		if(header == null) header = env.addHeader() ;
		
		QName addName = new QName(namespace , "add" , "ns");	//一定要加ns前缀
		SOAPBodyElement bodyEle = body.addBodyElement(addName);		//添加Body信息
		bodyEle.addChildElement("a").setValue("1");
		bodyEle.addChildElement("b").setValue("2");
		
		QName headerName = new QName(namespace , "licenceInfo" );;		//添加头信息
		header.addHeaderElement(headerName).setTextContent("admin");	//设置头信息的值
		
		msg.writeTo(System.out);		//发送前将soap消息打印出来
		
		SOAPMessage resultMsg = dispatch.invoke(msg);
		
		System.out.println("----------------relult---------------");
		
		resultMsg.writeTo(System.out) ;	//将返回的soap消息打印出来
	}

}




你可能感兴趣的:(契约优先方式编写wsdl + 隐式Header)