Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 2979|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2025-3-18 14:43
  • 签到天数: 805 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    73万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    731050
    发表于 2021-4-13 12:07:34 | 显示全部楼层 |阅读模式

    这里不介绍原理,只是记录自己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和引用

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-4-20 14:32 , Processed in 0.083700 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表