XML作为日常开发中一种常用的传输格式。jersey 也做了很优秀的支持。
我学习 《Java RESTful Web Service 实战》 一书。书中有些知识点,不太常用,但是比较重要,特写下次笔记已备忘。
jersey是遵循 JAX-RS2.0规范的一个实现,旨在使用java提供RESTful服务的框架
java 中对xml文档的处理有两大标准,JAXB
和 JAXP
- 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]。本人及时修改。