webservice服务 使用Spring注入注解时, 出现null情况及原因

11 篇文章 0 订阅
5 篇文章 0 订阅

原因找了很久,基本上是解决方法没有说原因的。最后在这个地址找到了原因:https://stackoverflow.com/questions/21193843/spring-autowired-in-web-service-not-working

spring的依赖注入必须父类也是被spring管理的,即ws的类上面需要加@Component注解,加了@Component注解,spring会注入对应的ws服务,但是在调用ws服务时spring并不会使用注入的ws实例,而且重新new一个ws,从而导致@Autowird出现null的情况,

猜想:可能是单例ws会出现线程安全问题吧,

在做项目的过程中,需要做一个中间服务,中间服务为单独一个java工程,对外提供webservice服务。 java工程采用的是Spring3.1和axis2相结合。

工程完成后,Spring注解没有问题,web服务也正常, web服务直接调用service层, 其中service层,用到的dao,来查询数据库。 代码如下:

web服务配置:

 

 <service name="Ws_co" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="className" value="com.lc.tobacco.order.service.impl.CgtOrderServiceImpl"/>
 </service>

 


service服务:

 

public class CgtOrderServiceImpl implements ICgtOrderService {

    private static final Logger logger = LoggerFactory.getLogger(CgtOrderServiceImpl.class);

    @Resource
    private ICgtOrderDao cgtOrderDao;
    
}

 

但是调用调用dao层时,出现cgtOrderDao=null错误。

 

 

String code="000";
String msg="获取数据成功!";
BigDecimal qtyLimit = zero;
try{
            
    Map custRsnQty = cgtOrderDao.getCustRsnQty(comId,custId);
}catch(Exception e ){
    code="104";
    msg="获取数据失败!e=="+e.toString();
    logger.debug("获取数据失败!e=="+e.toString());
}

 

如果按正常流程 controller --> service --> dao ,cgtOrderDao不为null,程序正常。
郁闷好久没有解决,只临时找到一个方案:

xml中增加:

 <bean id="cgtOrderDao"
  class="com.lc.tobacco.order.dao.impl.CgtOrderDaoImpl">
  <property name="dataSource" ref="dataSource" />
 </bean>

 

 

 

@Service("cgtOrderService")
public class CgtOrderServiceImpl implements ICgtOrderService {

    private static final Logger logger = LoggerFactory.getLogger(CgtOrderServiceImpl.class);

    @Resource
    private ICgtOrderDao cgtOrderDao;
    
    public ICgtOrderDao getCgtOrderDao() {
        return cgtOrderDao;
    }



    public void setCgtOrderDao() {
        
        WebApplicationContext context=ContextLoader.getCurrentWebApplicationContext();
        cgtOrderDao = (ICgtOrderDao)context.getBean("cgtOrderDao");
    }

 public String execute(String xmlStr) throws Exception {
  if(null == cgtOrderDao){
   setCgtOrderDao();


}
 

自己写webservice时,使用@Autowaired注入JDBCTemplate始终为NULL,

解决方法一:

网上百度,没扫描包,没注入service等都没有解决,最后找到一个有效的解决办法,

让webservice继承SpringBeanAutowiringSupport就行了 

 

用Spring注解方式:

配置扫描指定包下的类

<context:component-scan base-package="包名" />

标识类为spring管理的bean

@Component("注入名称")

    @Scope("注入方式")

    public class LoginService

 

Axis2的services.xml文件配置:

    <service name="loginService">  

        <description>WeatherService:Spring POJO Axis2 Service Sample</description>  

        <parameter name="ServiceObjectSupplier">  

            org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier  

        </parameter>  

        <parameter name="SpringBeanName">loginService</parameter>  

        <operation name="login" mep="http://www.w3.org/2004/08/wsdl/in-out">

<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

</operation>

    </service>

解决方法二:

写个获取上下文的utils

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 *
 * @author
 *
 */
public class ApplicationContextUtil implements ApplicationContextAware {

   private static ApplicationContext applicationContext;

   @Override
   public void setApplicationContext(ApplicationContext arg0) throws BeansException {

      applicationContext = arg0;
   }

   /**
    * 获取ApplicationContext
    *
    * @return
    */
   public static ApplicationContext getContext() {

      return applicationContext;
   }

   /**
    * 根据类名获取spring注入的类
    *
    * @param beanName
    * @return
    */
   @SuppressWarnings("unchecked")
   public static <T> T getBean(String beanName) {
      return (T) applicationContext.getBean(beanName);
   }

   /**
    * 根据类型获取spring注入的类
    * @param clazz
    * @return
    */
   public static <T> T getBean(Class<T> clazz) {
      return applicationContext.getBean(clazz);
   }

}

然后通过

ApplicationContextUtil.getBean("sysSensitivewordsService")来获取服务。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值