WSDL文件生成方式参照:
http://blog.csdn.net/a19881029/article/details/40194787
客户端代码生成方式参照:
http://blog.csdn.net/a19881029/article/details/40198649
最后生成的客户端代码格式如下:
MathStub.java类中的add方法有下面这一段代码:
- ......
- //其它构造函数最终都是调用这个函数创建MathStub对象
- public MathStub(org.apache.axis2.context.ConfigurationContext configurationContext,
- java.lang.String targetEndpoint, boolean useSeparateListener)
- throws org.apache.axis2.AxisFault {
- populateAxisService();
- populateFaults();
- _serviceClient = new org.apache.axis2.client.ServiceClient(
- configurationContext, _service);
- _serviceClient.getOptions().setTo(
- new org.apache.axis2.addressing.EndpointReference(targetEndpoint));
- _serviceClient.getOptions().setUseSeparateListener(useSeparateListener);
- _serviceClient.getOptions().setSoapVersionURI(
- org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
- }
- ......
- public com.sean.AddResponse add(com.sean.Add add0)
- throws java.rmi.RemoteException{
- ......
- // adding SOAP soap_headers
- _serviceClient.addHeadersToEnvelope(env);
- ......
- }
- ......
看了下ServiceClient的源码:
- ......
- private ArrayList<OMElement> headers;
- ......
- public void addHeader(OMElement header) {
- if (headers == null) {
- headers = new ArrayList<OMElement>();
- }
- headers.add(header);
- }
- /**
- * Add SOAP Header to be sent with outgoing messages.
- *
- * @param header header to be sent (non-<code>null</code>)
- */
- public void addHeader(SOAPHeaderBlock header) {
- if (headers == null) {
- headers = new ArrayList<OMElement>();
- }
- headers.add(header);
- }
- /** Remove all headers for outgoing message. */
- public void removeHeaders() {
- if (headers != null) {
- headers.clear();
- }
- }
- public void addStringHeader(QName headerName, String headerText) throws AxisFault {
- if (headerName.getNamespaceURI() == null ||
- "".equals(headerName.getNamespaceURI())) {
- throw new AxisFault("Failed to add string header,"
- + " you have to have namespaceURI for the QName");
- }
- OMElement omElement = OMAbstractFactory.getOMFactory()
- .createOMElement(headerName, null);
- omElement.setText(headerText);
- addHeader(omElement);
- }
- /**
- * Add all configured headers to a SOAP envelope.
- *
- * @param envelope the SOAPEnvelope in which to write the headers
- */
- public void addHeadersToEnvelope(SOAPEnvelope envelope) {
- if (headers != null) {
- SOAPHeader soapHeader = envelope.getHeader();
- for (Object header : headers) {
- soapHeader.addChild((OMElement)header);
- }
- }
- }
- ......
修改方式已经很明确了,在MathStub类中创建私有方法,通过AXIOM(使用版本为:1.2.14)生成所需头对象,然后将该头对象添加至ServiceClient对象即可
- ......
- import org.apache.axiom.om.OMAbstractFactory;
- import org.apache.axiom.om.OMElement;
- import org.apache.axiom.om.OMFactory;
- import org.apache.axiom.om.OMNamespace;
- import org.apache.axis2.client.ServiceClient;
- ......
- public MathStub(org.apache.axis2.context.ConfigurationContext configurationContext,
- java.lang.String targetEndpoint, boolean useSeparateListener)
- throws org.apache.axis2.AxisFault {
- populateAxisService();
- populateFaults();
- _serviceClient = new org.apache.axis2.client.ServiceClient(
- configurationContext, _service);
- //添加SOAP头
- this.addHeaders(_serviceClient);
- _serviceClient.getOptions().setTo(
- new org.apache.axis2.addressing.EndpointReference(targetEndpoint));
- _serviceClient.getOptions().setUseSeparateListener(useSeparateListener);
- _serviceClient.getOptions().setSoapVersionURI(
- org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
- }
- ......
- private void addHeaders(org.apache.axis2.client.ServiceClient _serviceClient){
- OMFactory omFactory = OMAbstractFactory.getOMFactory();
- OMNamespace omNS=omFactory.createOMNamespace("http://sean.com","sean");
- OMElement head = omFactory.createOMElement("Security", omNS);
- OMElement token = omFactory.createOMElement("Token", omNS);
- head.addChild(token);
- OMElement userName = omFactory.createOMElement("Username", omNS);
- userName.addChild(omFactory.createOMText(userName, "root"));
- token.addChild(userName);
- OMElement password = omFactory.createOMElement("Password", omNS);
- password.addAttribute(omFactory.createOMAttribute("Type", null, "PasswordText"));
- password.addChild(omFactory.createOMText(password, "123"));
- token.addChild(password);
- _serviceClient.addHeader(head);
- }
- ......
添加SOAP头之前的请求格式如下:
- <?xml version='1.0' encoding='utf-8'?>
- <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
- <soapenv:Body>
- <ns1:add xmlns:ns1="http://sean.com">
- <ns1:x>1</ns1:x>
- <ns1:y>1</ns1:y>
- </ns1:add>
- </soapenv:Body>
- </soapenv:Envelope>
添加SOAP头之后的请求格式如下:
- <?xml version='1.0' encoding='utf-8'?>
- <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
- <soapenv:Header>
- <sean:Security xmlns:sean="http://sean.com">
- <sean:Token>
- <sean:Username>root</sean:Username>
- <sean:Password Type="PasswordText">123</sean:Password>
- </sean:Token>
- </sean:Security>
- </soapenv:Header>
- <soapenv:Body>
- <ns1:add xmlns:ns1="http://sean.com">
- <ns1:x>1</ns1:x>
- <ns1:y>1</ns1:y>
- </ns1:add>
- </soapenv:Body>
- </soapenv:Envelope>