java寫webservice接口


有一個需求:要求根據設備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還不是很熟悉,還需要加強學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM