`

使用JAX-WS的Provider和 Dispatch发布WebService的例子

    博客分类:
  • SOA
 
阅读更多

1.使用Provider发布服务代码

package demo.order.provider;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

@WebServiceProvider()
@ServiceMode(value = Service.Mode.MESSAGE)            
public class OrderProcessDOMProvider implements Provider<DOMSource> {

    public OrderProcessDOMProvider() {
     }

    public DOMSource invoke(DOMSource request) {
        DOMSource response = new DOMSource();
        try {
            MessageFactory factory = MessageFactory.newInstance();
            SOAPMessage soapReq = factory.createMessage();
            soapReq.getSOAPPart().setContent(request);
    
            System.out.println("Incoming Client Request as a DOMSource data in MESSAGE Mode");
            soapReq.writeTo(System.out);
            System.out.println("\n");
            
            Node processOrderNode = soapReq.getSOAPBody().getFirstChild();
            
            Node order = processOrderNode.getChildNodes().item(0);
           
            NodeList list = order.getChildNodes();
            for(int i = 0 ; i<list.getLength() ; i++){
            	
            	System.out.println(list.item(i).getNodeName() + "=" + 
            			list.item(i).getFirstChild().getNodeValue());
            }
           
            SOAPMessage orderResponse =  factory.createMessage();
            QName processOrderQName = new QName("http://order.demo/", "processOrder");
            QName responseQName = new QName("http://order.demo/", "return");
            SOAPElement processOrderResponse = orderResponse.getSOAPBody().addChildElement(processOrderQName);
            processOrderResponse.addChildElement(responseQName).addTextNode("ORD1234");
            response.setNode(orderResponse.getSOAPPart());
			
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return response;
    }
}

 这里的 Provider泛型中可传入javax.xml.transform.Source类型,javax.activation.DataSource类型 和javax.xml.soap.SOAPMessage类型

javax.xml.transform.Source类型又有如下子类

  1.DOMSource

  2.SAXSource

  3.StreamSource

ServiceMode注解来以来指定接收请求报文的模式(Service.Mode.MESSAGE 或 Service.Mode.PAYLOAD)

 

发布服务代码:

package demo.order.provider;
import javax.xml.ws.Endpoint;

public class Server {

    protected Server() throws Exception {
        System.out.println("Starting Server");

	    Object implementor = new OrderProcessDOMProvider();
        String address = "http://localhost:8080/OrderProcessDOMProvider";
        Endpoint.publish(address, implementor);
        
    }

    public static void main(String args[]) throws Exception {
        new Server();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }

}

 

生成的WSDL:

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://provider.order.demo/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="OrderProcessDOMProviderService" targetNamespace="http://provider.order.demo/">
  <wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://provider.order.demo/" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://provider.order.demo/">
  <xsd:element name="invoke" nillable="true" type="xsd:anyType"/>
  <xsd:element name="invokeResponse" nillable="true" type="xsd:anyType"/>
</xsd:schema>
  </wsdl:types>
  <wsdl:message name="invokeResponse">
    <wsdl:part element="tns:invokeResponse" name="invokeResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="invoke">
    <wsdl:part element="tns:invoke" name="invoke">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="OrderProcessDOMProvider">
    <wsdl:operation name="invoke">
      <wsdl:input message="tns:invoke" name="invoke">
    </wsdl:input>
      <wsdl:output message="tns:invokeResponse" name="invokeResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="OrderProcessDOMProviderServiceSoapBinding" type="tns:OrderProcessDOMProvider">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="invoke">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="invoke">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="invokeResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="OrderProcessDOMProviderService">
    <wsdl:port binding="tns:OrderProcessDOMProviderServiceSoapBinding" name="OrderProcessDOMProviderPort">
      <soap:address location="http://localhost:8080/OrderProcessDOMProvider"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 客户端代码如下:

package demo.order.dispatcher;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.Service.Mode;


public final class DispatcherClient {

	public static final String WSDLFile = "http://localhost:8080/OrderProcessDOMProvider?wsdl";

    public DispatcherClient() {
    }

    public static void main(String args[]) throws Exception {

		URL wsdlURL = new URL(WSDLFile);

        MessageFactory factory = MessageFactory.newInstance();

        QName domProvider = new QName("http://provider.order.demo/", "OrderProcessDOMProviderService");
        QName portName = new QName("http://provider.order.demo/", "OrderProcessDOMProviderPort");

        Service service = Service.create(wsdlURL, domProvider);
        
        SOAPMessage soapRequest = factory.createMessage();
        
        
        QName processOrderQName = new QName("http://order.demo/", "processOrder");
       //create the element - <http://order.demo/:processOrder></http://order.demo/:processOrder>
        SOAPElement processOrderResponse = soapRequest.getSOAPBody().addChildElement(processOrderQName);
        SOAPElement order = processOrderResponse.addChildElement("arg0");
        order.addChildElement("customerID").addTextNode("Naveen");
        order.addChildElement("itemID").addTextNode("I001");
        order.addChildElement("price").addTextNode("200.00");
        order.addChildElement("qty").addTextNode("200");

        DOMSource domRequestMsg = new DOMSource(soapRequest.getSOAPPart());
        Dispatch<DOMSource> domMsg = service.createDispatch(portName, DOMSource.class, Mode.MESSAGE);

        DOMSource domResponseMsg = domMsg.invoke(domRequestMsg);
        
        SOAPMessage soapReq = factory.createMessage();
        soapReq.getSOAPPart().setContent(domRequestMsg);

        System.out.println("Client Request as a DOMSource data in MESSAGE Mode");
        soapReq.writeTo(System.out);
        System.out.println("\n");
        
        System.out.println("Response from server: " + domResponseMsg.getNode().getLastChild().getTextContent());

        }

}

 

分享到:
评论
1 楼 糯米烧麦 2016-11-14  
按上文说明ws发布成功了,但浏览器输入url?wsdl报404,provider是空实现,输出控制台日志,返回null。发布方法与上图一致

相关推荐

    使用JAX-WS(JWS)发布WebService

    使用JAX-WS(JWS)发布WebService 使用myeclipse开发java的webservice的两种方式 方式一: (此方式只能作为调试,有以下bug:jdk1.6u17?以下编译器不支持以Endpoint.publish方式发布document方式的soap,必须在...

    MyEclipse8_0中使用 JAX-WS 部署 WebService 实例

    MyEclipse8_0中使用 JAX-WS 部署 WebService 实例 - 外衣 - 博客频道 - CSDN_NET.mht

    JAX-WS_WebService.rar

    JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用

    jax-ws webservice demo

    基于jax-ws 实现的web service client和server端的demo程序。 注:如果使用的是 myeclipse 时 server 部署到tomcat 启动的时候会报错 解决办法:找到myeclipse安装目录下的 plugins 目录里 查找 webservices-rt.jar,...

    如何基于JAX-WS开发一个WebService实例

    NULL 博文链接:https://liuyunlong1229.iteye.com/blog/1678559

    webService部署tomcat需要的jax-ws jar包

    webService部署tomcat需要的jax-ws 的完整jar包

    JAX-WS发布webservice例子

    JAX-WS发布webservice例子,基于http://blog.csdn.net/yy_love_my/article/details/44938329所说的做的一个简单且能运行的列子,基于maven工程,如果使用servlet发布方式,执行命令:mvn tomcat7:run

    JAX-WS自学笔记

    JAX-WS使用教程 1、JAX-WS概述 2、创建Web Service 2.1 从java开始 2.1.1 运行wsgen 2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 运行wsimport 2.2.2 生成的java代码 2.3发布Web ...

    jax-ws WebService客户端与服务端工程.rar

    jax-ws客户端与服务端工程.rar-------------

    jax-ws发布webservice

    以jdk1.6以上自带的jax-ws来发布webservice,压缩包里包含服务端和客户端,下载导入即可启动运行测试,有疑问的话欢迎咨询哈

    jax-ws webservice简单demo

    jax-ws webservice完整demo,包含所有jax-ws 2.2jar包。

    JAX-WS 2.2 RI所有相关jar包

    JAX-WS 2.2 RI 所包含的JAR包集合,包含25个JAR包,列表如下: FastInoset.jar gmbal-api-only.jar ha-api.jar javax.annotation.jar javax.mail_1.4.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jaxws-api...

    webservice之jax-ws

    NULL 博文链接:https://hgxs-org.iteye.com/blog/1940916

    Jax-ws所需要的JAR包

    亲测可用,Jax-ws所需要的JAR包,拷贝到tomcat安装路径的lib里,实现了webservice发布到tomcat,赞!

    JAX-WS实现WebService.zip

    欢迎下载JAX-WS实现WebService.zip。本压缩文件介绍了如何使用JAX-WS技术实现WebService 参考博客:http://blog.csdn.net/gaohuanjie/article/details/50523517

    metro-jax-ws-master

    The Java API for XML Web Services (JAX-WS) is a Java programming language API for creating web services, particularly SOAP services. JAX-WS is one of the Java XML programming APIs. It's a part of the ...

    WebService之JAX-WS自学笔记

    JAX-WS使用教程 1、JAX-WS概述 2、创建Web Service 2.1 从java开始 2.1.1 运行wsgen 2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 运行wsimport 2.2.2 生成的java代码 2.3...

    基于JAX-WS2.2开发WebService所需jar资源包

    使用 Eclipse JavaEE 开发 WebService 时,若选择手动创建原生的JAX-WS服务,需要导入此jar资源(教程详见我的博文https://blog.csdn.net/weixin_50604409/article/details/116399530)。 如果您同时装有 IntelliJ ...

    jax-ws创建webservice

    利用myeclipse创建的 jax-ws demo

    JAX-WS在Tomcat中发布服务

    JAX-WS在Tomcat中发布服务实例,同时在Handler中实现简单的授权校验。

Global site tag (gtag.js) - Google Analytics