WebService與Spring整合部署


服務端(CXF發布webservice)

1、  http://cxf.apache.org/download.html下載 cxf文件包(3.1.18必須使用Java 7或Java 8)。

2、  將下載包的lib文件夾下的jar全部拷貝到spring項目中的lib目錄下,注意刪除相同的jar包(版本號不同拷貝不會替換)。

3、  刪除以下4個jar包:

cxf-services-ws-discovery-api-3.1.5.jar

cxf-services-ws-discovery-service-3.1.5.jar

cxf-services-wsn-api-3.1.5.jar

cxf-services-wsn-core-3.1.5.jar

4、  web.xml配置如下:

<!-- 配置cxf框架 cxf-servlet.xml -->

    <servlet>

        <servlet-name>cxf</servlet-name>

        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

        <init-param>

                 <param-name>config-location</param-name>

                 <param-value>classpath:conf/cxf-servlet.xml</param-value>

        </init-param>

    </servlet>

    <servlet-mapping>

        <servlet-name>cxf</servlet-name>

        <url-pattern>/webservice/*</url-pattern>

</servlet-mapping>

 

 

5、  conf目錄下添加cxf-servlet.xml文件, cxf-servlet.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                   xmlns:jaxws="http://cxf.apache.org/jaxws"

                   xsi:schemaLocation=" http://www.springframework.org/schema/beans

                                                                 http://www.springframework.org/schema/beans/spring-beans.xsd

                                                                 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

   

    <!-- 加載提供的服務 -->

    <jaxws:endpoint id="helloService" address="/MyWebService"

                 implementor="net.evecom.hr.MyWebService"></jaxws:endpoint>

</beans>

 

7、  在net.evecom.hr目錄下創建MyWebService類,如下:

package net.evecom.hr;

import javax.jws.WebParam;

import javax.jws.WebService;



@WebService

public class MyWebService {

 
    public String hiMyService(@WebParam(name = "content") String content) {

        System.out.println("客戶端發送過來了:" + content);

        return "服務器返回:" + content;

    }

}

 

8、啟動tomcat,訪問localhost:8080/項目名/webservice/,查看是否正常啟動。

 

客戶端(axis2獲取webservice)

1、  http://axis.apache.org/axis2/java/core/download.html下載axis2-1.7.9;

2、  將下載包lib文件夾下的jar包復制到另一個項目lib目錄下;

3、  測試代碼如下:

package net.evecom.hr;

 

import java.util.Iterator;

 

import javax.xml.namespace.QName;

 

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.AxisFault;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

 

import com.alibaba.fastjson.JSONObject;

 

public class Test {



    public static void main(String[] args) {

        // TODO Auto-generated method stub

        String url = "http://localhost:8080/項目名/webservice/MyWebService?wsdl";

        sendWsdl(url, "啊啊啊啊啊");

    }

 
    public static void sendWsdl(String url, String xmlStr) {

        JSONObject res = new JSONObject();

        try {

            String endpoint = url.replace("?wsdl", "");// 不需要傳?wsdl

            // 直接引用遠程的wsdl文件

            Options options = new Options();

            options.setTo(new EndpointReference(endpoint));

            ServiceClient sender = new ServiceClient();

            sender.setOptions(options);

 

            OMFactory fac = OMAbstractFactory.getOMFactory();

            OMNamespace omNs = fac.createOMNamespace("http://hr.evecom.net/", "");// 參數1(uri)=即為wsdl文檔的targetNamespace;參數2(prefix)=可不填

            OMElement method = fac.createOMElement("hiMyService", omNs);// 方法名

            QName qname = new QName("content");

            OMElement in0 = fac.createOMElement(qname);// 方法參數

            in0.setText(xmlStr); // 參數值

            method.addChild(in0); // 添加參數


            OMElement resultEle = sender.sendReceive(method);// 調用wsdl

            System.out.println("調用接口結果:" + resultEle.toString());

 
            Iterator<?> iterator = resultEle.getChildElements();

            OMElement result1 = null;

            while (iterator.hasNext()) {

                result1 = (OMElement) iterator.next();

                System.out.println(result1.getText());

            }


        } catch (AxisFault ex) {

            ex.printStackTrace();

        }

    }

}

4、運行代碼,查看是否正常返回

 

至此,簡單的webservice與Spring整合部署完成。

 

=====================================我是一條分割線============================================

 

添加攔截器:

  1. 服務端配置如下:

a)         cxf-servlet.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                   xmlns:jaxws="http://cxf.apache.org/jaxws"

                   xsi:schemaLocation=" http://www.springframework.org/schema/beans

                                                                 http://www.springframework.org/schema/beans/spring-beans.xsd

                                                                 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

   

    <bean id="webServiceInterceptor" class="net.evecom.common.interceptors.WebServiceInterceptor"></bean>

    <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>

    <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>

   

    <!-- 加載提供的服務 -->

    <jaxws:endpoint id="webServiceTest" address="/MyWebService" implementor="net.evecom.webservice.hr.MyWebService">

                 <!-- 添加in攔截器 -->

                       <jaxws:inInterceptors>

                            <ref bean="loggingInInterceptor" />

                            <ref bean="webServiceInterceptor" />

                       </jaxws:inInterceptors>

                       <!-- 添加out攔截器 -->

                       <jaxws:outInterceptors>

                            <ref bean="loggingOutInterceptor" />

                       </jaxws:outInterceptors>

         </jaxws:endpoint>

                

                  <!-- <jaxws:server id="webServiceTest" serviceClass="net.evecom.webservice.hr.MyWebService"

                   address="/MyWebService">

                   <jaxws:serviceBean>

                            <ref bean="MyWebService" />

                   </jaxws:serviceBean>

         </jaxws:server> -->

</beans>

 

 

b)         添加WebServiceInterceptor,代碼如下:

/*

 * Copyright (c) 2005, 2016, EVECOM Technology Co.,Ltd. All rights reserved.

 * EVECOM PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.

 *

 */

package net.evecom.common.interceptors;

 

import java.util.List;

 

import org.apache.cxf.binding.soap.SoapMessage;

import org.apache.cxf.headers.Header;

import org.apache.cxf.interceptor.Fault;

import org.apache.cxf.phase.AbstractPhaseInterceptor;

import org.apache.cxf.phase.Phase;

import org.w3c.dom.Element;


import net.evecom.common.util.MD5;

 

public class WebServiceInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    private static final String TOKEN = "test";

    public WebServiceInterceptor(String phase) {

        super(phase);

    }

    public WebServiceInterceptor() {

        super(Phase.PRE_INVOKE);

    }

 
    public void handleMessage(SoapMessage message) throws Fault {

        List<Header> headers = message.getHeaders();

        if (headers == null || headers.size() == 0) {

            throw new Fault(new IllegalArgumentException("沒有Header,攔截器實施攔截"));

        }

        Header firstHeader = headers.get(0);

        Element ele = (Element) firstHeader.getObject();

        String token = ele.getFirstChild().getTextContent();

        if (!token.equals(MD5.parseMD5(TOKEN))) {

            throw new Fault(new IllegalArgumentException("token不正確"));

        }
    }

}
  1. 客戶端需要在發送請求時,添加頭消息(token=md5.parseMD5(“test”)),代碼如下:
       // 創建消息頭:token=evecomoa

            SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory();

            // SOAPHeaderBlock soapHeader = soapFactory.createSOAPHeaderBlock("RequestHeader", omNamespace);

            // 添加頭消息內容

            SOAPHeaderBlock soapHeaderBlock = soapFactory.createSOAPHeaderBlock("token", omNamespace);

            soapHeaderBlock.addChild(soapFactory.createOMText(MD5.parseMD5("test")));

            // soapHeader.addChild(soapHeaderBlock);

            // 將消息頭加入到當前消息中

            sender.addHeader(soapHeaderBlock);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM