Web Service的CXF實現(Spring整合方式)

 新建Java Web項目,採用maven管理jar包,本文章只是提供核心代碼文件以下:java

(1)maven的pom.xmlweb

(2)cxf-base.xmlspring

(3)cxf-bz-client.xml 客戶端配置express

(4)cxf-bz-server.xml服務端配置apache

(5)WSOrderService 業務接口定義app

(6)WSOrderServiceImpl 業務接口實現frontend

(7)BZClientHandler,BZServiceHandler 用戶認證攔截maven

(8)web.xml 項目web配置ide

(9)demo.properties url和用戶配置信息ui

備註:其中涉及spring相關配置文件未列出。

 

1) 主要核心pom.xml配置以下:

   <!-- spring framework -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-aop</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-asm</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-beans</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-expression</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-orm</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-tx</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
   <version>${spring.version}</version>
  </dependency> 
  <!--end of spring framework -->
  
  <!-- CXF Dependencies -->
  <dependency>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-rt-frontend-jaxws</artifactId>
   <version>${cxf.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-common</artifactId>
    <version>2.5.4</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-core</artifactId>
    <version>${cxf.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>${cxf.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
  <!-- End of CXF Dependencies -->

(2)cxf-base.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" 
    xmlns:http-conf="http://cxf.apache.org/transports/http/configuration" 
    xsi:schemaLocation="   
        http://www.springframework.org/schema/beans    
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
        http://cxf.apache.org/jaxws    
        http://cxf.apache.org/schemas/jaxws.xsd
        http://cxf.apache.org/transports/http/configuration
        http://cxf.apache.org/schemas/configuration/http-conf.xsd">  
        
 <http-conf:conduit name="*/.*">
  <http-conf:client AllowChunking="false" />
 </http-conf:conduit> 
  
 <import resource="classpath:META-INF/cxf/cxf.xml" />  
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    <!-- 對接web service配置 -->
    <import resource="classpath:conf/cxf/cxf-bz-server.xml" />
    <import resource="classpath:conf/cxf/cxf-bz-client.xml" />
</beans>

(3)cxf-bz-client.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:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:jaxws="http://cxf.apache.org/jaxws" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
 default-lazy-init="true">
 <!--    -->
 <bean id="bzClientSoapHandler" class="com.lshop.ws.util.BZClientHandler">
      <property name="accountNum" value="${bz.ws.account}"></property>
     <property name="password" value="${bz.ws.password}"></property>
    </bean>
  
<!-- -->
 <jaxws:client id="bzExpressService" name="bzExpressService" serviceClass="com.lshop.ws.web.bz.order.BzExpressService" wsdlLocation="${bz.sys.url}/ws/WSOrderService?wsdl">
  <jaxws:handlers>
   <ref bean="bzClientSoapHandler" />
  </jaxws:handlers>
  
 </jaxws:client>
</beans>

(4)cxf-bz-server.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:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:jaxws="http://cxf.apache.org/jaxws" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
 default-lazy-init="true">
<!--       -->
 <bean id="bzServerSoapHandler" class="com.lshop.ws.util.BZServiceHandler">
     <property name="accountNum" value="${bz.ws.account}"></property>
     <property name="password" value="${bz.ws.password}"></property>
    </bean>
    <jaxws:server  serviceClass="com.lshop.ws.server.bz.order.service.WSOrderService" address="/WSOrderService">
     <jaxws:handlers>
      <ref bean="bzServerSoapHandler" />
     </jaxws:handlers>
   
     <jaxws:serviceBean>
      <ref bean="WSOrderService" />
     </jaxws:serviceBean>
    </jaxws:server>
 
</beans>

 

(5)WSOrderService定義業務接口

package com.lshop.ws.server.bz.order.service;
import java.util.Date;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import com.lshop.ws.server.bz.order.bean.LvOrderDtoResposne;

@WebService(name = "WSOrderService")
@SOAPBinding(style=Style.RPC)
public interface WSOrderService  {
 /**
  * 同步已經審覈的訂單到商務接口定義
  * @Method: synAuditOrderToBZ 
  * @Description:  
  * @param startTime  審覈開始時間
  * @param endTime    審覈結算時間
  * @return OrderList
  */
 public LvOrderDtoResposne synAuditOrderToBZ(
   @WebParam(name = "startTime") String startTime,
   @WebParam(name = "endTime") String endTime);
 
}

(6)WSOrderServiceImpl業務實現類

package com.lshop.ws.server.bz.order.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.jws.WebService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Service;
import com.gv.core.hibernate3.HibernateBaseDAO;
import com.gv.core.service.impl.BaseServiceImpl;
import com.gv.core.util.ObjectUtils;
import com.lshop.common.pojo.logic.LvOrderDetails;
import com.lshop.common.pojo.logic.LvOrderPackageDetails;
import com.lshop.common.util.DateUtils;
import com.lshop.ws.server.bz.order.bean.LvOrderDto;
import com.lshop.ws.server.bz.order.bean.LvOrderDtoResposne;
import com.lshop.ws.server.bz.order.bean.LvProductDto;
import com.lshop.ws.server.bz.order.bean.Result;

@Service("WSOrderService")
@WebService(endpointInterface = "com.lshop.ws.server.bz.order.service.WSOrderService")
public class WSOrderServiceImpl extends BaseServiceImpl implements WSOrderService {
 @Resource
 private HibernateBaseDAO dao;
 
 private static final Log logger = LogFactory.getLog(WSOrderServiceImpl.class);
 
 /**
  * 同步已經審覈的訂單到商務接口定義
  * @Method: synAuditOrderToBZ 
  * @Description:  
  * @param startTime  審覈開始時間(查詢範圍起始時間,格式:yyyy-mm-dd HH:mm:ss)
  * @param endTime    審覈結束時間(查詢範圍結束時間,格式:yyyy-mm-dd HH:mm:ss)
  * @return OrderList
  */
 @Override
 public LvOrderDtoResposne synAuditOrderToBZ(String startTime, String endTime) {
  if(logger.isInfoEnabled()){
     logger.info("*****WSOrderServiceImpl.synAuditOrderToBZ() method begin*****");
  }
  
  LvOrderDtoResposne lvOrderDtoResposne=new LvOrderDtoResposne();
  List<LvOrderDto> orderList=new ArrayList<LvOrderDto>();
  //判斷查詢日期時間差
  
  //根據審覈時間查詢已經審覈訂單集合
  try {
   if(ObjectUtils.isNotEmpty(startTime)&&ObjectUtils.isNotEmpty(endTime)){
    String hql=" select DISTINCT ls.ord as ord from  LvOrderLogs ls,LvOrder o " +
      " where ls.ord=o.oid " +
      " and o.isServiceAudit=1 " +
      " and o.isFinanceAudit=1 " +
      " and o.isdelete=0 " +
      " and ls.createTime>=:startTime and ls.createTime <=:endTime ";
    Map param=new HashMap();
    param.put("startTime", DateUtils.convertToDateTime(startTime));
    param.put("endTime", DateUtils.convertToDateTime(endTime));
    List listTmp = dao.getMapListByHql(hql, param).getList();
    if(ObjectUtils.isNotEmpty(listTmp)){
     for (int i = 0; i < listTmp.size(); i++) {
      Map map=(Map) listTmp.get(i);
      //查詢訂單信息
      LvOrderDto lvOrderDto=this.getOrderInfo(String.valueOf(map.get("ord")));
         orderList.add(lvOrderDto);
     }
    }
   }
   lvOrderDtoResposne.setOrderList(orderList);
   lvOrderDtoResposne.getResult().setStatus(Result.STATUS_SUCCEED);
   lvOrderDtoResposne.getResult().setMessage("成功");
  } catch (Exception e) {
   lvOrderDtoResposne.getResult().setStatus(Result.STATUS_FAIL);
   lvOrderDtoResposne.getResult().setMessage(e.getMessage());
   e.printStackTrace();
  }
  
  if(logger.isInfoEnabled()){
   logger.info("*****WSOrderServiceImpl.synAuditOrderToBZ() method end*****");
  }
  return lvOrderDtoResposne;
 }
 
 
 /**
  * 
  * @Method: getOrderDetailsByOid 
  * @Description: 根據訂單號查詢訂單詳情及對應的產品信息
  * @param oid  訂單號
  * @return List<LvProductDto>
  */
 protected List<LvProductDto> getOrderDetailsByOid(String oid){
  
  return null;
 }
 
 /**
  * 
  * @Method: getOrderInfo 
  * @Description: 根據訂單號查詢訂單
  * @param oid  訂單號
  * @return List<LvProductDto>
  */
 protected LvOrderDto getOrderInfo(String oid){
  
  return null;
 }
}

(7)BZClientHandler,BZServiceHandler用戶認證攔截。

package com.lshop.ws.util;
import java.io.IOException;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import javax.xml.ws.soap.SOAPFaultException;
 
public class BZClientHandler implements SOAPHandler<SOAPMessageContext> {
 
 private String accountNum;
 private String password;
 
  public String getAccountNum() {
  return accountNum;
 }
 public void setAccountNum(String accountNum) {
  this.accountNum = accountNum;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 @Override
    public boolean handleMessage(SOAPMessageContext context) {
  
  System.out.println("Server : handleMessage()......");
  
  
  try{
      SOAPMessage soapMsg = context.getMessage();
      SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
         SOAPHeader soapHeader = soapEnv.getHeader();
  
             //if no header, add one
      if (soapHeader == null){
              soapHeader = soapEnv.addHeader();
       }
  
       
      SOAPElement accountNumNode = soapHeader.addChildElement(new QName("http://service.webservice.datainterface.bz.gv.com/","accountNum"));
      accountNumNode.setNodeValue("accountNum");
      accountNumNode.setValue(accountNum);
      
      SOAPElement passwordNode = soapHeader.addChildElement(new QName("http://service.webservice.datainterface.bz.gv.com/","password"));
      passwordNode.setNodeValue("password");
      passwordNode.setValue(password);
   
      soapMsg.writeTo(System.out);
      return true;
  
   }catch(SOAPException e){
    System.err.println(e);
   }catch(IOException e){
    System.err.println(e);
   }
  
  
    //continue other handler chain
    return false;
  }
  
  @Override
  public boolean handleFault(SOAPMessageContext context) {
  
   System.out.println("Server : handleFault()......");
  
   return true;
  }
  
  @Override
  public void close(MessageContext context) {
   System.out.println("Server : close()......");
  }
  
  @Override
  public Set<QName> getHeaders() {
   System.out.println("Server : getHeaders()......");
   return null;
  }
  
      private void generateSOAPErrMessage(SOAPMessage msg, String reason) {
        try {
           SOAPBody soapBody = msg.getSOAPPart().getEnvelope().getBody();
           SOAPFault soapFault = soapBody.addFault();
           soapFault.setFaultString(reason);
           throw new SOAPFaultException(soapFault); 
        }
        catch(SOAPException e) { }
     }
}

(8)web.xml配置web servcie請求攔截url.

 <!--備註:只是保留關鍵配置,省略了其餘配置信息-->
 <!-- web service config  begin-->
 <servlet>  
        <servlet-name>cxf</servlet-name>  
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>cxf</servlet-name>  
        <url-pattern>/ws/*</url-pattern>  
    </servlet-mapping>  
 <!-- web service config  end-->

(9)demo.properties

bz.sys.url=http\://127.0.0.1\:8080
bz.ws.account=demo
bz.ws.password=demo400

 

配置完成能夠經過下面的服務端url訪問

http://127.0.0.1:8080/ws/WSOrderService?wsdl

客戶端先生成客戶端java文件,在調用接口實現便可。

附錄:生成webservice的java客戶端文件命令。

參考:http://my.oschina.net/ukapollo/blog/191038

相關文章
相關標籤/搜索