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