Web Service的CXF實現(Spring整合方式)
新建Java Web項目,采用maven管理jar包,本文章只是提供核心代碼文件如下:
(1)maven的pom.xml
(2)cxf-base.xml
(3)cxf-bz-client.xml 客戶端配置
(4)cxf-bz-server.xml服務端配置
(5)WSOrderService 業務接口定義
(6)WSOrderServiceImpl 業務接口實現
(7)BZClientHandler,BZServiceHandler 用戶認證攔截
(8)web.xml 項目web配置
(9)demo.properties url和用戶配置信息
備注:其中涉及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文件,在調用接口實現即可。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!