Web Service的CXF实现(Spring整合方式)
jopen
11年前
新建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文件,在调用接口实现即可。