前段時間在開發一個簡訊發送的接入功能,涉及到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是否發布成功