资讯专栏INFORMATION COLUMN

jersey 框架传输格式 (2) xml

betacat / 3350人阅读

摘要:作为日常开发中一种常用的传输格式。对应的,定义了三种标准类型的输入接口和输出接口,。实体类如果请求的传输数据量很大,并且无需和外系统对接的场景,建议使用属性来组织,这样可以极大的减小格式的数据包的规模。如有版权侵犯,请联系邮箱。

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 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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110328.html

相关文章

  • jersey 框架传输格式 (2) xml

    摘要:作为日常开发中一种常用的传输格式。对应的,定义了三种标准类型的输入接口和输出接口,。实体类如果请求的传输数据量很大,并且无需和外系统对接的场景,建议使用属性来组织,这样可以极大的减小格式的数据包的规模。如有版权侵犯,请联系邮箱。 XML作为日常开发中一种常用的传输格式。jersey 也做了很优秀的支持。 我学习 《Java RESTful Web Service 实战》 一书。书中有...

    The question 评论0 收藏0
  • jersey 框架传输格式 (1) 基础类型

    摘要:在学习中看到框架支持几乎多有的原生类型的传输格式。是遵循规范的一个实现,旨在使用提供服务的框架原生类型中整型数值浮点型数值编码字符型数值布尔类型值都提供支持,并且提供了,基础类型的数组形式的支持。 在学习jersey中看到jersey框架支持几乎多有的java原生类型的传输格式。 我学习 《Java RESTful Web Service 实战》 一书。书中有些知识点,不太常用,但是...

    liangzai_cool 评论0 收藏0
  • 记录第一次搭建基于JAX-RS的REST风格DEMO

    摘要:中引入了模块的概念,默认情况下,中将不再包含的包,而在时关于这个都是捆绑在一起的。 因为是初学REST风格,所以并不打算马上就用springMVC这些框架去实现restful,所以先用jersey搭建一个rest的demo上手玩玩,本文记录了搭建所需要引入的jar包,以及搭建过程碰到的坑,希望能让大家有所收获,欢迎交流! 1、Maven jar包引入 ...

    ybak 评论0 收藏0
  • JAX-RS 2.0 中 REST 的四种服务类型

    摘要:当不存在子类,也不存在子类时,规范中定义,在这种情况下,为服务动态生成一个名为的实例,并自动探测匹配资源。其中是中的基类,它继承于情况二当不存在子类,但是存在子类时。以上就是规范中定义的四种服务的方式。 最近在学习 jersey 框架。他是 目前比较流行的 基于 JAX-RS 2.0 规范实现的 RESTful 框架。 我是跟着 《Java RESTful Web Service 实...

    bbbbbb 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<