原因找了很久,基本上是解决方法没有说原因的。最后在这个地址找到了原因: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")来获取服务。

本文探讨了Spring Web Service中@Autowired注解无法正确注入Bean的问题,并提供了多种解决方案,包括继承SpringBeanAutowiringSupport、配置Spring Object Supplier及手动获取Bean。
167万+

被折叠的 条评论
为什么被折叠?



