Web Service StateService 示例

Web Service StateService 提供获取所有 State 信息和根据 stateCode 获取 State 信息两个接口,本文演示如何部署 StateService 到 JBoss EAP 6,并通过 soapUI 调运 StateService。

StateService 部署

mvn clean install

可以生成 StateService.jar,我们将 StateService.jar 部署到 JBoss EAP 6,JBoss 日志出现如下信息说明部署成功:

18:16:07,231 INFO  [org.jboss.ws.cxf.metadata] (MSC service thread 1-3) JBWS024061: Adding service endpoint metadata: id=StateServiceImpl
 address=http://localhost:8080/StateService/stateService/StateServiceImpl
 implementor=org.teiid.stateservice.StateServiceImpl
 serviceName={http://www.teiid.org/stateService/}stateService
 portName={http://www.teiid.org/stateService/}StateServiceImplPort
 annotationWsdlLocation=null
 wsdlLocationOverride=null
 mtomEnabled=false

使用 Java 代码调运 StateService

运行 StateServiceClient 会依次调运 getAllStateInfo() 和 getStateInfo() 方法。

同样 StateServiceClient 也演示了不同的 CXF 客户端的编写,包括:

  • CXF Proxy API 客户端
final Service service = Service.create(wsdlURL, serviceName);
StateService client = service.getPort(portName, StateService.class);
  • CXF Dispatch JAXB 客户端
final Service service = Service.create(wsdlURL, serviceName);
JAXBContext ctx = JAXBContext.newInstance("org.teiid.stateservice.jaxb", StateServiceClient.class.getClassLoader());
Dispatch<Object> dispatch = service.createDispatch(portName, ctx, Mode.PAYLOAD);
Object response = dispatch.invoke(new ObjectFactory().createGetAllStateInfo());
  • CXF Dispatch SOAP 请求客户端
final Service service = Service.create(wsdlURL, serviceName);
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Mode.MESSAGE);
String getAll = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:stat=\"http://www.teiid.org/stateService/\"><soapenv:Header/><soapenv:Body><stat:GetAllStateInfo></stat:GetAllStateInfo></soapenv:Body></soapenv:Envelope>";
SOAPMessage response = dispatch.invoke(getRequest(getAll));
  • CXF Dispatch DOMSource 客户端
final Service service = Service.create(wsdlURL, serviceName);
Dispatch<Source> dispatch = service.createDispatch(portName, Source.class, Mode.PAYLOAD);
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document requestDoc = db.newDocument();
Element rootElement = requestDoc.createElementNS("http://www.teiid.org/stateService/", "GetAllStateInfo");
requestDoc.appendChild(rootElement);
DOMSource request = new DOMSource(requestDoc);
Source response = dispatch.invoke(request);
  • CXF Dispatch StAXSource 客户端
service = Service.create(serviceName);
String bindingId = "http://schemas.xmlsoap.org/wsdl/soap/http";
String endpointAddress = "http://localhost:8080/StateService/stateService/StateServiceImpl?WSDL";
service.addPort(portName, bindingId, endpointAddress);
Dispatch<StAXSource> dispatch = service.createDispatch(portName, StAXSource.class, Mode.PAYLOAD);
		
String xmlRequest = "<GetAllStateInfo xmlns=\"http://www.teiid.org/stateService/\"/>";
XMLInputFactory factory = XMLInputFactory.newInstance();
StAXSource source = new StAXSource(factory.createXMLStreamReader(new ByteArrayInputStream(xmlRequest.getBytes())));
StAXSource returnValue = dispatch.invoke(source);

使用 soapUI 调运 StateService

soapUI create project

  • 选择 GetAllStateInfo -> Request 1,发送 SOAP 请求如下图所示

soapUI getall

所有 State 信息被返回

  • 选择 GetStateInfo -> Request 1,发送 SOAP 请求如下图所示

soapUI getone

返回结果 SOAP 消息如下所示:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:GetStateInfoResponse xmlns:ns2="http://www.teiid.org/stateService/">
         <StateInfo>
            <Name>California</Name>
            <Abbreviation>CA</Abbreviation>
            <Capital>Sacramento</Capital>
            <YearOfStatehood>1850</YearOfStatehood>
         </StateInfo>
      </ns2:GetStateInfoResponse>
   </soap:Body>
</soap:Envelope>