jersey 框架傳輸格式 (2) xml

東來發表於2015-01-16

XML作為日常開發中一種常用的傳輸格式。jersey 也做了很優秀的支援。

我學習 《Java RESTful Web Service 實戰》 一書。書中有些知識點,不太常用,但是比較重要,特寫下次筆記已備忘。

jersey是遵循 JAX-RS2.0規範的一個實現,旨在使用java提供RESTful服務的框架

java 中對xml文件的處理有兩大標準,JAXBJAXP

  • JAXB (Java API for XML Processing)
  • JAXP (Java Architecture for XML Binding, jsr-222)

JAXP 標準
JAXP 包含了 DOM,SAX,StAX三種解析xml的技術標準。

對應的,JAXP定義了三種標準型別的輸入介面 Source(DOMSource, SAXSource, StreamSource) 和輸出介面, Result(DOMResult, SAXResult, StreamReault)。jersey 可以使用JAXP的輸入型別最為REST方法的引數。

java// StAX
@POST
@Path("stream")
@Consumes(MediaTYpe.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public StreamSource getStreamSource( 
// 接收 型別
javax.xml.transform.stream.StreamSource streamSource) {

    // 返回 型別。
    return streamSource;
}

“`java
// SAX
@POST
@Path(“sax”)
@Consumes(MediaTYpe.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public SAXSource getSAXSource(
// 接受 型別
javax.xml.transform.sax.SAXSource saxSource
){
// 返回 型別
return saxSource;
}


```java // DOM @POST @Path("doc") @Consumes(MediaTYpe.APPLICATION_XML) @Produces(MediaType.APPLICATION_XML) public Document getDocument( // 接受 型別 org.w3c.dom.Document document){ // 返回 型別 return document; }

優缺點:JAXP的缺點是需要編碼解析XML,這樣正加了開發成本,但對於業務邏輯的實現沒有實際貢獻。JAXB只需要在POJO中定義相關的註解(早起人們是使用XML配置檔案老做這件事),使其和XML的schema對應,無需對XML進行程式是解析,彌補了JAXP的這一缺點。

使用JAXB的開發效率更高,相對於JAXP的效能更高。開發過程簡化,執行邏輯簡化,是的JAXP帶來的優勢就可以基本忽略不計,綜合考量,實現起來更簡單的JAXB更適合REST開發。

jersey支援使用JAXBElement作為REST方法引數形式,也支援直接使用POJO作為REST方法引數的形式,這種形式更為常用。示例程式碼如下。

java@POST
@Path("jaxb")
@Consumes(MediaTYpe.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public Book getEntity(JAXBElement<Book> booElement){
    Book book = booElement.getValue();
    System.out.println(book.getBookName());
    return book;
}

// book 實體類
@XmlRootElement
public class Book implements Serializable {

    @XmlAttribute(name = "bookId")
    public Long getBookId(){
        return bookId;
    }

    @XmlAttribute(name = "bookName")
    public String getBookName(){
        return bookName;
    }

    @XmlAttribute(name = "publisher")
    public String getPublisher(){
        return publisher;
    }
}
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><book bookId="1000" bookName="test book">

如果REST請求的傳輸資料量很大,並且無需和外系統對接的場景,建議使用屬性來組織XML,這樣可以極大的減小XML格式的資料包的規模。

XML_SECURITY_DISABLE

jersey 預設設定了 XMLConstants.FEATURE_SECURE_PROCESSING屬性,當屬性或元素過多的時候,回報 well-formedness error這樣的錯誤資訊。這是可以通過設定MessageProperties.XML_SECURITY_DISABLE的引數值為TRUE來遮蔽。

伺服器和客戶端示例程式碼如下。

@ApplicationPath("/*")
public class AirResourceConfig extends ResourceConfig {
    public AirResourceConfig () {
        packages("com.example");
        property(MessageProperties.XML_SECURITY_DISABLE, Boolean.TRUE);
    }
}

以上文字片段以及圖片,部分來自於 《Java RESTful Web Service 實戰》一書。如有版權侵犯,請聯絡郵箱[ychangsheng@gmail.com]。本人及時修改。

相關文章