spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)

Posted 沪深狙击手

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)相关的知识,希望对你有一定的参考价值。

这里不介绍原理,只是记录自己spring+cxf的开发过程和遇到的问题

场景:第三方公司需要调用我们的业务系统,以xml报文的形式传递数据,之后我们解析报文存储到我们数据库生成业务单据;

WebService的框架由多种,这里选cxf,与Spring的集成比较好;

直接看代码

1 项目用的maven,首先添加依赖(这个依赖啊  ,教程引用几个的都有,这个看需要吧,我是用了四个)

          <dependency>
              <groupId>org.apache.cxf</groupId>
              <artifactId>cxf</artifactId>
              <version>2.7.11</version>
              <type>pom</type>
          </dependency>
          <dependency>
              <groupId>org.apache.cxf</groupId>
              <artifactId>cxf-rt-frontend-jaxws</artifactId>
              <version>2.7.11</version>
          </dependency>
          <dependency>
              <groupId>org.apache.cxf</groupId>
              <artifactId>cxf-rt-transports-http</artifactId>
              <version>2.7.11</version>
          </dependency>
          <dependency>  
              <groupId>org.apache.cxf</groupId>  
              <artifactId>cxf-rt-transports-http-jetty</artifactId>  
              <version>2.7.11</version>  
         </dependency>

2 配置web.xml,在原来基础上添加(这里我只是添加cxf配置,spring中基础的配置之前项目中肯定有,像什么context-param什么的我想你们肯定早就有了)

 <!-- cxf -->
  
    <servlet>  
        <servlet-name>CXFServlet</servlet-name>  
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>CXFServlet</servlet-name>  
        <url-pattern>/webservice/*</url-pattern>  
    </servlet-mapping>  

3 配置applicationContext.xml(还是在原来的基础上添加如下)

   3.1 首先在该xml添加命名空间,这是我在原来基础上添加的(红色部分是我自己添加的)

  

   3.2 在原来基础上添加

 <!-- cxf配置 -->
    <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" />  

    <bean id="reimBillHandler" class="com.ufgov.lp.xml.sax.handler.ReimBillHandler" />
    
    <bean id="reciveBillServiceImpl" class="com.ufgov.lp.bill.webservice.impl.ReciveBillServiceImpl">  
        <property name="reimBillHandler" ref="reimBillHandler"></property>  
    </bean> 
    
    <jaxws:endpoint id="reciveBillService"  
        implementor="#reciveBillServiceImpl" address="/reciveBillService" /> 
    <!-- cxf配置结束 -->

 接下来开始写代码

4 定义接口

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;


/**
 * 
 * <p>接收报文接口</p>
 * @author shangcg
 * @since 2017年11月1日
 */

@WebService
public interface ReciveBillService {
  
  @WebMethod  
  public String request(@WebParam(name = "xmlStr") String xmlStr);   

}

5 创建实现类

import javax.annotation.Resource;
import javax.jws.WebService;

import com.ufgov.lp.bill.webservice.ReciveBillService;
import com.ufgov.lp.bill.webservice.bean.LpBizBillDataCollect;
import com.ufgov.lp.xml.sax.handler.ReimBillHandler;


@WebService
public class ReciveBillServiceImpl implements ReciveBillService {

  @Resource 
  ReimBillHandler reimBillHandler;
  
  
 
  @Override
  public String request(String xmlStr) {
    

    try {
      /**与数据库结构一致的javaBean对象*/
      LpBizBillDataCollect lpBizBillDataCollect  = new LpBizBillDataCollect();
      
      //把传过来的报文直接装到对象中(实际上业务系统一般得对XML解析,这里不说解析)
      lpBizBillDataCollect.setField01(xmlStr);
      
      //插入数据库(reimBillHandler注入进来才能调用方法)
      reimBillHandler.excuteBillInsert(lpBizBillDataCollect);
      
    } catch (Exception e) {
      e.printStackTrace();
    }
    return "这里是返回的报文";
  }

  
  public ReimBillHandler getReimBillHandler() {
    return reimBillHandler;
  }

  //注意这里的set方法,不然稍后配置bean后会注入不进来
  public void setReimBillHandler(ReimBillHandler reimBillHandler) {
    this.reimBillHandler = reimBillHandler;
  }

}

6看ReimBillHandler (这个类就是本来业务系统已经存在的用@service标注的类,成功注入该类后,如果该类在注入其他类咱们就可以不用管了)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ufgov.lp.bill.dao.LpBizBillDao;
import com.ufgov.lp.bill.webservice.bean.LpBizBillDataCollect;


/**
 * 
 * <p>注入LpBizBillDao插入数据</p>
 * @author shangcg
 * @since 2017年11月3日
 */
@Service
public class ReimBillHandler{
  
  @Autowired
  LpBizBillDao lpBizBillDao;
  
  
  /**插入数据库表数据*/
  public int excuteBillInsert(LpBizBillDataCollect lpBizBillDataCollect){
    
    return lpBizBillDao.insert(lpBizBillDataCollect);//插入数据库数据
  }
  
}

 

说一下这些过程中我遇到的错误:

1 spring的bean注入不进来  解决:以@WebService注解的类,引用spring中bean事需要干两件事,第一是用@Resource注解注入,不是@autowire;   第二必须有set方法 ; 第三是ApplicationContext.xm必须配置bean和引用

以上是关于spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)的主要内容,如果未能解决你的问题,请参考以下文章

系统开发系列 之WebService(spring框架+maven+CXF框架)部署问题及解决方案

Spring整合CXF之发布WebService服务

spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)

SpringBoot Spring Cloud 整合cxf开发webService接口服务端-流程步骤

CXF Spring开发WebService,基于SOAP和REST方式

在Myeclipse下使用CXF和Spring开发Web Service