Java SOAP SAAJ 客户端通过JAXB将SOAP Server返回XML映射为Java对象

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soapenv:Body>
		<addValueResponse xmlns="http://service.web.com">
			<addValueReturn>80.0</addValueReturn>
		</addValueResponse>
	</soapenv:Body>
</soapenv:Envelope>

 

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;

@XmlRootElement(name = "addValueResponse", namespace = "http://service.web.com")
@XmlAccessorType(XmlAccessType.FIELD)
public class addValueReturn {
	@XmlElement(name = "addValueReturn", namespace = "http://service.web.com")
	private String addValueReturn;

	public String getaddValueReturn() {
		return addValueReturn;
	}

	public void setaddValueReturn(String addValueReturn) {
		this.addValueReturn = addValueReturn;
	}

}

 

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 * SOAP Client Implementation using SAAJ Api.
 */
public class SaaJSoapClient {
	/**
	 * Method used to create the SOAP Request
	 */
	private static SOAPMessage createSOAPRequest() throws Exception {
		MessageFactory messageFactory = MessageFactory.newInstance();
		SOAPMessage soapMessage = messageFactory.createMessage();
		SOAPPart soapPart = soapMessage.getSOAPPart();

		/*
		 * Construct SOAP Request Message: <soap:Envelope
		 * xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
		 * xmlns:sam="http://samples.axis2.techdive.in"> <soap:Header/> <soap:Body>
		 * <sam:getStudentName> <!--Optional:--> <sam:rollNumber>3</sam:rollNumber>
		 * </sam:getStudentName> </soap:Body> </soap:Envelope>
		 */

		// SOAP Envelope
		SOAPEnvelope envelope = soapPart.getEnvelope();
		envelope.addNamespaceDeclaration("sam", "http://service.web.com");

		// SOAP Body
		SOAPBody soapBody = envelope.getBody();
		SOAPElement soapBodyElem = soapBody.addChildElement("addValue", "sam");
		SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("value", "sam");
		soapBodyElem1.addTextNode("80");

		soapMessage.saveChanges();

		// Check the input
		System.out.println("Request SOAP Message = ");
		soapMessage.writeTo(System.out);
		System.out.println();
		return soapMessage;
	}

	/**
	 * Method used to print the SOAP Response
	 */
	private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception {
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		Source sourceContent = soapResponse.getSOAPPart().getContent();
		System.out.println("\nResponse SOAP Message = ");
		StreamResult result = new StreamResult(System.out);
		transformer.transform(sourceContent, result);
	}

	public static String getvaluefromxml(String inxml) {
		System.out.println(inxml);
		String tempxml = inxml;
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		InputSource is;
		String outval = null;
		try {
			builder = factory.newDocumentBuilder();
			is = new InputSource(new StringReader(tempxml));
			Document doc = builder.parse(is);

			Element root = doc.getDocumentElement();
			NodeList children = root.getChildNodes();
			System.out.println(children.toString());
			for (int i = 0; i < children.getLength(); i++) {
				Node child = children.item(i);
				if (child instanceof Element) {
					var childElement = (Element) child;
					System.out.println(childElement.getTagName());
					System.out.println(childElement.getTextContent());
				}
				System.out.println(child.getNodeName());
				System.out.println(child.getNodeValue());

			}

			NodeList list = doc.getElementsByTagName("addValueReturn");
			outval = list.item(0).getTextContent();
			// System.out.println(outval);

		} catch (ParserConfigurationException e) {
		} catch (SAXException e) {
		} catch (IOException e) {
		}
		return outval;

	}

	/**
	 * Starting point for the SAAJ - SOAP Client Testing
	 */
	public static void main(String args[]) throws FileNotFoundException {
		try {
			// Create SOAP Connection
			SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
			SOAPConnection soapConnection = soapConnectionFactory.createConnection();

			// Send SOAP Message to SOAP Server
			String url = "http://localhost:8080/SOAPServer/services/HelloWorld?wsdl";
			SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);

			ByteArrayOutputStream os = new ByteArrayOutputStream();
			String strSOAPResponse = "";
			soapResponse.writeTo(os);
			strSOAPResponse = new String(os.toByteArray());
			System.out.println(strSOAPResponse);
			System.out.println(getvaluefromxml(strSOAPResponse));
			try {
				XMLInputFactory xif = XMLInputFactory.newFactory();
				final StringReader reader = new StringReader(strSOAPResponse);
				XMLStreamReader xsr = xif.createXMLStreamReader(reader);
				xsr.nextTag(); // Advance to Envelope tag

				xsr.nextTag(); // Advance to Body tag
				xsr.nextTag();
				// xsr.nextTag();

				JAXBContext jc = JAXBContext.newInstance(addValueReturn.class);
				Unmarshaller unmarshaller = jc.createUnmarshaller();
				JAXBElement<addValueReturn> je = unmarshaller.unmarshal(xsr, addValueReturn.class);

				// System.out.println(je.getName());
				// System.out.println(je.getValue());
				System.out.println("SOAP Response addValueReturn: " + je.getValue().getaddValueReturn());
			} catch (XMLStreamException e) {
				e.printStackTrace();
			} catch (JAXBException e) {
				e.printStackTrace();
			}

			// Process the SOAP Response
			printSOAPResponse(soapResponse);

			soapConnection.close();
		} catch (Exception e) {
			System.err.println("Error occurred while sending SOAP Request to Server");
			e.printStackTrace();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值