fayeyiwang 2010-01-11
最近做一个联通彩信接入的上行模块开发时碰到的问题。
需求描述:开发一个webservice接收来自彩信中心的消息(MO)
使用框架:spring2.5.3 + axis2 1.4.1 (jax-ws2.0) + mina
问题描述:由于是使用jax-ws技术因此根据WSDL生成的代码为annotation的,因此无需配置即可在axis2中发布,所以问题出现:
1、想通过配置来对象注入到service中无法实现(在此时没找到解决此问题的部分)。
2、在serivce中使用axis2 api读取soap消息,消息始终为null。
(如果不使用annotation来描述webservice,是可以使用配置来注入bean的,在server端也能正常的读取soap消息。)
解决办法:(既然是使用annotation来描述webservice,那当然得用spring annotation来注入了。读取soap消息也一样)
1、用@Autowired来修饰需注入的bean,目标类需继承SpringBeanAutowiringSupport(这个功能应该是在2.5.3的版本中增加的)。
2、使用@Resource来修饰需要捕获的soap消息。
代码:
import java.util.Map; import javax.annotation.Resource; import javax.jws.WebMethod; import javax.jws.WebService; import javax.servlet.http.HttpServletRequest; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.context.support.SpringBeanAutowiringSupport; @WebService(targetNamespace = "http://www.demon.service",serviceName = "HelloService", name = "demon") public class Hello extends SpringBeanAutowiringSupport{ /** * Logger for this class */ private static final Logger logger = Logger.getLogger(Hello.class); @Autowired private XXBean bean;//此处的bean的名称要与spring中bean的id一致。 @Resource WebServiceContext wsContext; @WebMethod(operationName = "sayHello") public String sayHello(String name){ javax.xml.ws.handler.MessageContext context = wsContext.getMessageContext(); } }
参考资料:http://docs.huihoo.com/spring/2.5.x/zh-cn/remoting.html