zoukankan      html  css  js  c++  java
  • Java CXF框架调用Web Service接口

    WebService接口调用(CXF框架)

    maven中添加cxf依赖:

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.4.4</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.4.4</version>
    </dependency>
    

    下载生成工具并解压:http://cxf.apache.org/download.html

    版本请与依赖保持一直。

    IDEA设置:

    File -> Setting -> Tools -> Web Service设置CXF为生成工具根路径,如:C:DevKitapache-cxf-3.4.4

    IDEA Project窗口选中要生成的包,工具栏点击Tools -> WebService -> Generate Java Code From Wsdl

    填入WSDL地址、输出路径,Service Platform选择CXF,确定生成。

    PS:IDEA 2019版本存在bug,没有Generate Java Code From Wsdl菜单,详见此文章或更换IDEA版本。


    追加Header认证

    首先添加自定义Header处理类:

    
    static class ClientAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
        /**
        * 认证头格式:
        *    <tns:RequestSOAPHeader xmlns:tns="http://sys.webservice.client">
        *    		<tns:user>user</tns:user>
        *    		<tns:password>password</tns:password>
        *    </tns:RequestSOAPHeader>
        */
    
        private static final String USER = "user";
        private static final String PASSWORD = "password";
    
        public ClientAuthInterceptor() {
            super(Phase.PREPARE_SEND);
        }
    
        @Override
        public void handleMessage(SoapMessage message) throws Fault {
            List<Header> headers = message.getHeaders();
            Document doc = DOMUtils.createDocument();
    
            Element header = doc.createElement("tns:RequestSOAPHeader");
            header.setAttribute("xmlns:tns", "http://sys.webservice.client");
    
            Element user = doc.createElement("tns:user");
            user.setTextContent(USER);
            Element password = doc.createElement("tns:password");
            password.setTextContent(PASSWORD);
    
            header.appendChild(user);
            header.appendChild(password);
            headers.add(new Header(new QName(""), header));
        }
    }
    
    导包详情
    import org.apache.cxf.binding.soap.SoapMessage;
    import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
    import org.apache.cxf.binding.soap.interceptor.SoapHeaderInterceptor;
    import org.apache.cxf.endpoint.Client;
    import org.apache.cxf.frontend.ClientProxy;
    import org.apache.cxf.headers.Header;
    import org.apache.cxf.helpers.DOMUtils;
    import org.apache.cxf.interceptor.Fault;
    import org.apache.cxf.phase.AbstractPhaseInterceptor;
    import org.apache.cxf.phase.Phase;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    import java.io.File;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.List;
    import javax.xml.namespace.QName;
    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.BindingProvider;
    import javax.xml.ws.RequestWrapper;
    import javax.xml.ws.ResponseWrapper;
    

    添加自定义Header处理器:

    // 这两行是工具生成出来的接口
    ISysNotifyTodoWebServiceService ss = new ISysNotifyTodoWebServiceService(wsdlURL, SERVICE_NAME);
    ISysNotifyTodoWebService port = ss.getISysNotifyTodoWebServicePort();
    
    // 创建接口时添加自定义Header处理器
    Client client = ClientProxy.getClient(port);
    client.getOutInterceptors().add(new ClientAuthInterceptor());
    
  • 相关阅读:
    python类变量与成员变量,及模块中类变量共享
    python制作GUI界面---搞定软件界面编程
    pycharm运行PyQt5出现错误This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
    pycharm安装包下载慢的问题解决
    DNS隧道实验
    关于虚拟机win Server 2003只能打开百度网页其他网页都打不开??
    Python如何将决策树dot文件转化为png文件
    如何将虚拟机win7成功联网
    关于虚拟机win2003忘记登录密码(待解决)
    虚拟机kali忘记密码后问题解决&&kali用桥接模式成功联网
  • 原文地址:https://www.cnblogs.com/lixin-link/p/15076964.html
Copyright © 2011-2022 走看看