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]。本人及时修改。


东来
1.7k 声望55 粉丝

一年磨一剑,专心写程序