前段时间在开发一个短信发送的接入功能,涉及到webServices接口的调用和被调用。下面记录下axis2 spring集成开发webServices的步骤(假设web工程已配置ssh集成并已正常运行)。
1、添加所需jar包
2、java类,调用和被调用的主要代码
/**
*调用外部webservices主要代码
/**
private static EndpointReference targetEPR = new EndpointReference(CmProperties.get("zn_webservice_url")); //从配置文件中获取webservices接口的调用路径
private static QName qName = new QName(CmProperties.get("zn_qname") , "main"); //获取调用的命名空间 和 方法名
public static byte[] callZNWebService(String xml){
RPCServiceClient serviceClient = null;
try {
serviceClient = new RPCServiceClient();
} catch (AxisFault e3) {
LOGGER.error("rpc调用出现异常,webservice调用失败.错误信息:"+e3.getMessage());
return null;
}
Options options = serviceClient.getOptions();
options.setTimeOutInMilliSeconds(9000000);
options.setProperty(HTTPConstants.SO_TIMEOUT, 9000000);
options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, 9000000);
options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Boolean.TRUE);
options.setTo(targetEPR);
try {
Object[] args = new Object[] {xml.getBytes("UTF-8")};
Class[] returnTypes = new Class[] { byte[].class };
Object[] response = new Object[]{};
response = serviceClient.invokeBlocking(qName,args, returnTypes);
byte[] result = (byte[])response[0];
return result;
} catch (Exception e) {
LOGGER.error("webservice调用失败.错误信息:"+e.getMessage());
return null;
}finally{
try {
serviceClient.cleanupTransport();
} catch (AxisFault e) {
LOGGER.error("webservice调用失败.错误信息:"+e.getMessage());
return null;
}
}
}
/**
* SmsService类的方法,提供被调用的webservice接口
*smsReceipt为被调用的方法名
/**
public byte[] smsReceipt(byte[] xmlstr) {
// TODO Auto-generated method stub
BASE64Decoder b64d = new BASE64Decoder();
byte[] re = null;
try {
//约定收到的内容会进行BASE64Decoder编码,所以此处先进行解码
re = b64d.decodeBuffer(new String(xmlstr));
StringReader sr = new StringReader(new String(re,"UTF-8"));
SAXReader saxxmlReader = new SAXReader();
Document d = saxxmlReader.read(new InputSource(sr));
Element root = d.getRootElement();
List<Element> nodeElements = root.elements("note");
if(nodeElements.size()>0){
for(int i=0;i<nodeElements.size();i++){
Element e = nodeElements.get(i);
String staccount = e.elementText("account");
//这里做相关的逻辑处理
}
}
} catch (Exception e) {
logger.error("错误信息"+e.getMessage());
}
return genericAnswerXML("1");
}
private byte[] genericAnswerXML(String code){
String xml = "<root><code>"+code+"</code></root>";
BASE64Encoder b64e = new BASE64Encoder();
byte[] xmlencode = null;
try {
//返回时进行BASE64Decoder编码(约定交互时进行BASE64编码)
xmlencode = b64e.encodeBuffer(xml.getBytes("UTF-8")).getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("webservice接口构造成功返回标识时BASE64编码失败。错误信息:"+e.getMessage());
}
return xmlencode;
} *
3、spring配置文件application*.xml的配置
<bean id="smsService" class="cn.ltang.cm.webservice.SmsService">
<!-- 需注入的service类-->
<property name="ecpInfoManager" ref="ecpInfoManager"/>
<property name="smsRecordManager" ref="smsRecordManager"/>
</bean>
4、web.xml配置
<!-- 添加spring监听器 -->< listener >
< listener-class >
org.springframework.web.context.ContextLoaderListener
</ listener-class >
</ listener >
<!-- 加载spring的配置文件 -->
< context-param >
< param-name > contextConfigLocation </ param-name >
< param-value > classpath:applicationContext*.xml </ param-value >
</ context-param >
<!-- 注册axis2的servlet -->
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>
org.apache.axis2.transport.http.AxisServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
5、在WEB-INF\services\axis\META-INF\目录下配置services.xml(不存在则自己创建)
<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
<service name="smsService">
<!-- <parameter name="ServiceClass">cn.ltang.cm.webservice.SmsService</parameter> -->
<parameter name="ServiceObjectSupplier" locked="false">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier</parameter>
<parameter name="SpringBeanName" locked="false">smsService</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
</service>
</serviceGroup>
最后,测试,发布。浏览器访问 http://localhost:8080/工程名/services/smsService?wsdl 查看webservices是否发布成功