有一個需求:要求根據設備mac和終端設備類型來查詢設備庫存狀態。
接口協議是采用webservice協議,信息交互方式為xml格式信息
輸入參數存放到XML各個節點下,並轉為一個String,作為接口的輸入參數。XML的封裝格式如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<MSG_CONTENT>
< DEVICE_MAC></ DEVICE_MAC>
< DEVICE_TYPE></ DEVICE_TYPE>
</MSG_CONTENT>
</ROOT>
輸出參數存放到XML各個節點下,並轉為一個String,作為接口的輸出參數。XML的封裝格式如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
< RESULT_CODE >返回編碼</ RESULT_CODE >
< RESULT_MSG >失敗描述</ RESULT_MSG >
<STATE>終端狀態</STATE>
<IS_EXIST>終端是否存在</IS_EXIST>
<OWNER_CITY>終端歸屬地市</OWNER_CITY>
</ROOT>
webservice也就是web服務,是一種跨平台跨語言的服務,類似就是一個第三方的服務,你寫好接口讓別人來調用,你是提供服務的一方。接口都是用來提供服務的,接口就是一組功能的集合。
在java中寫webservice接口,需要在接口類上標注@WebService注解,表明這是一個webservice,@WebParam(name = "DEVICE_MAC")這個注解標注在方法參數上,表示獲取的參數,注釋用於定制從單個參數至 Web Service 消息部件和 XML 元素的映射。
例如:
@WebService
public interface qryIptvStateService {
//根據設備mac和設備類型查詢庫存狀態信息
String qryIptvState(@WebParam(name = "DEVICE_MAC") String DEVICE_MAC);
}
現在實現這個接口
endpointInterface: 服務接口全路徑, 指定做SEI(Service EndPoint Interface)服務端點接口
serviceName:表示對外發布的服務名(也就是接口文檔中的方法名),指定 Web Service 的服務名稱:wsdl:service。缺省值為 Java 類的簡單名稱 + Service。
@WebService(endpointInterface = "intf.zznode.device.qryIptvStateService", serviceName = "qryIptvState")
public class qryIptvStateServiceImpl extends BaseService implements qryIptvStateService {
@Override
public String qryIptvState(String xml) {
//業務代碼
}
}
現在開始使用java構建xml文檔節點
例如要構建這樣結構的xml文檔
<ROOT>
<MSG_CONTENT>
< DEVICE_MAC></ DEVICE_MAC>
< DEVICE_TYPE></ DEVICE_TYPE>
</MSG_CONTENT>
</ROOT>
主要的作用就是便於java對象與xml文件節點元素之間的轉換
@XmlRootElement(name = "ROOT")將這個注解標注在java類上,表示這個是xml文檔的根元素,名字為ROOT。
@XmlRootElement(name = "ROOT")
public class ROOTStoreInfo {
//root下面的msg_content元素
private StoreMsgContent MSG_CONTENT;
//setter/getter方法
}
public class StoreMsgContent {
private String DEVICE_MAC;
private String DEVICE_TYPE;
//setter/getter方法
}
最終構建出來的xml文檔為
<ROOT>
<MSG_CONTENT>
< DEVICE_MAC></ DEVICE_MAC>
< DEVICE_TYPE></ DEVICE_TYPE>
</MSG_CONTENT>
</ROOT>
//最后需要將傳入的xml格式的字符串映射解析為java類
public static <T> T xml2Object(String xmlStr, Class<T> c) {
try {
// JAXB(即Java Architecturefor XML Binding)是一個業界的標准,
//即是一項可以根據XML Schema產生Java類的技術。
//該過程中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,
//並能將Java對象樹的內容重新寫到XML實例文檔。
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
T t = (T) unmarshaller.unmarshal(new StringReader(xmlStr));
return t;
} catch (JAXBException e) {
e.printStackTrace();
return null;
}
}
現在能夠實現用java類構建xml格式的文檔節點信息,並且能將傳入的字符形式的xml格式數據映射為標注了@XmlRootElement的類。
現在需要將操作結果返回。
//用於響應返回的xml文檔信息
//@XmlType 注解 propOrder的值是一個字符串數組,用來設置xml文檔節點的順序
@XmlRootElement(name = "ROOT")
@XmlType(propOrder = {"RESULT_CODE", "RESULT_MSG", "STATE", "IS_EXIST", "OWNER_CITY","OTT_STB_ID"})
public class ROOTStoreInfoRespone {
private String RESULT_CODE;//返回編碼:1成功,0失敗
private String RESULT_MSG;//失敗描述,RESULT_CODE為0必填
private String STATE;//終端設備狀態,RESULT_CODE為1必填
private String IS_EXIST;//終端設備是否存在:1存在,0不存在
private String OWNER_CITY;//終端歸屬地市,IS_EXIST為1時必填
private String OTT_STB_ID;//OTT序列號sn
//setter/getter方法
}
//用於將java類轉換為xml格式
public static String getXml(ROOTStoreInfoRespone root) {
StringWriter wr = new StringWriter();
try {
//JAXBContext將java類與xml文檔相互轉換
JAXBContext context = JAXBContext.newInstance(ROOTStoreInfoRespone.class);
//使用Marshaller生成xml文件
Marshaller mar = context.createMarshaller();
//格式化xml格式
mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//去掉生成xml的默認報文頭
// mar.setProperty(Marshaller.JAXB_FRAGMENT, true);
mar.marshal(root, wr);
return wr.toString().replace("standalone=\"yes\"", "");
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//調用
getXml(rootStoreInfoRespone)
總結:
java寫webservice部分
@WebService該注解用於對接口,類進行注解,表示要發布的web服務。
它的屬性(不全):
- serviceName:表示發布的服務名稱(通常為接口中的方法名稱)
- endpointInterface:表示發布服務的接口,采用類路徑表示。
@WebParam(name = "DEVICE_MAC")表示方法的參數,注解用於標注參數,這個參數和傳入的xml節點元素名相同,值為這個節點的值。
@WebResult表示方法的返回值
加上這兩個注解 方法參數以及方法返回值將跟注解保持一致
如果不加,則wdsl中的參數是org01遞增的,返回為return
java構建和解析xml部分
@XmlRootElement(name = "ROOT")將這個注解標注在java類上,表示這個是xml文檔的根元素,名字為ROOT。這個類里面的屬性即為xml中的節點元素。
@XmlType(propOrder = {"RESULT_CODE", "RESULT_MSG", "STATE", "IS_EXIST", "OWNER_CITY","OTT_STB_ID"})表示是xml類型。
propOrder 是一個字符數組,表示的是xml中節點元素的先后順序。
xml格式的字符串映射為java類
將java類解析為xml文檔格式。
主要是這次開發任務做了一個這樣的需求,特此記錄一下,對於webservice還不是很熟悉,還需要加強學習。