XML类型是使用最广泛的数据类型,Jersey 对XML类型的数据处理,支持Java领域的两大标准,即JAXP(Java API for XML Processing,JSR-206)和JAXB(Java Architecture for XML Binding,JSR-222),JAXP标准包含了DOM、SAX和StAX 三种解析技术标准。

  • DOM是面向文档解析的技术,要求将XML数据全部加载到内存,映射为树和结点模型以实现解析
  • SAX是事件驱动的流解析技术,通过监听注册事件,触发回调方法以实现解析
  • StAX是拉式流解析技术,拉式解析使得读取过程可以主动推进当前XML位置的指针而不是被动的获得解析中的XML数据。

JAXP定义了三种标准类型的输入接口Source(DOMSource、SAXSource、StreamSource)和输出接口Result(DOMResult、SAXResult和StreamResult),示例代码如下:

/**

* 使用 StAX 拉式流解析技术

*

* @param streamSource

* @return

*/

        @POST

        @Path("stream")

        @Produces(MediaType.APPLICATION_XML)

        @Consumes(MediaType.APPLICATION_XML)

        public StreamSource getStreamSource(StreamSource streamSource) {

                return streamSource;

        }

 
 

        /**

* 使用 SAX 事件驱动的流解析技术

*

* @param saxSource

* @return

*/

        @POST

        @Path("saxsource")

        @Produces(MediaType.APPLICATION_XML)

        @Consumes(MediaType.APPLICATION_XML)

        public SAXSource getSAXSource(SAXSource saxSource) {

                return saxSource;

        }

 
 

        /**

* 使用DOM面向文档解析技术

*

* @param domSource

* @return

*/

        @POST

        @Path("domsource")

        @Produces(MediaType.APPLICATION_XML)

        @Consumes(MediaType.APPLICATION_XML)

        public DOMSource getSAXSource(DOMSource domSource) {

                return domSource;

        }

 
 

        /**

* 使用DOM面向文档解析技术

*

* @param document

* @return

*/

        @POST

        @Path("doc")

        @Produces(MediaType.APPLICATION_XML)

        @Consumes(MediaType.APPLICATION_XML)

        public Document getSAXSource(Document document) {

                return document;

        }

JAXP 的缺点是需要编码解析XML,则增加了开发成本,但对业务逻辑的实现并没有实质的贡献,JAXB只需要在POJO定义相关的注解,使其和XML的schema对应,无须对XML进行程序式解析,弥补了JAXP的这个缺点,JAXB通过序列化和反序列化实现了XML数据和POJO对象的自动转换过程,JAXB的注解位于javax.xml.bind.annotation 包,从性能来说 JAXB低于JAXP,但使用JAXB的开发效率很高,示例代码如下:

  • POJO代码

    @XmlRootElement

    public class CreateParam implements Serializable
    {

            private String name;

            private String sex;

            private TestEnum testEnum;

     
     

            @XmlAttribute(name = "name")

            public String getName() {

                    return name;

            }

     
     

            public
    void
    setName(String name) {

                    this.name = name;

            }

     
     

            @XmlAttribute(name = "sex")

            public String getSex() {

                    return sex;

            }

     
     

            public
    void
    setSex(String sex) {

                    this.sex = sex;

            }

     
     

            @XmlAttribute(name = "testEnum")

            public TestEnum getTestEnum() {

                    return testEnum;

            }

     
     

            public
    void
    setTestEnum(TestEnum testEnum) {

                    this.testEnum = testEnum;

            }

    }

     
     

    @XmlRootElement

    public class DemoResult implements Serializable {

    private boolean hasError;

    private int returnCode;

    private String message;

     
     

    @XmlAttribute(name = "hasError")

    public boolean isHasError() {

    return hasError;

    }

     
     

    public void setHasError(boolean hasError) {

    this.hasError = hasError;

    }

     
     

    @XmlAttribute(name = "returnCode")

    public int getReturnCode() {

    return returnCode;

    }

     
     

    public void setReturnCode(int returnCode) {

    this.returnCode = returnCode;

    }

     
     

    @XmlAttribute(name = "message")

    public String getMessage() {

    return message;

    }

     
     

    public void setMessage(String message) {

    this.message = message;

    }

    }

     
     

  • REST服务代码

            @POST

            @Path("jaxb")

            @Produces(MediaType.APPLICATION_XML)

            @Consumes(MediaType.APPLICATION_XML)

            public DemoResult getEntity(CreateParam createParam) {

                    DemoResult result = new
    DemoResult();

                    result.setHasError(false);

                    result.setMessage("创建 name=" + createParam.getName() + "\tsex=" + createParam.getSex()

                                    + "\tenum value=" + createParam.getTestEnum().getEnumValue()

                                    + "\tenum desc=" + createParam.getTestEnum().getEnumDesc());

     
     

                    System.out.println(createParam.getTestEnum() == TestEnum.Error);

     
     

                    return result;

            }

  • 单元测试代码

    @Test

    public void PostJaxbXMLTest() {

    CreateParam createParam = new CreateParam();

    createParam.setName("jaxbXml");

    createParam.setSex("man男人");

    createParam.setTestEnum(TestEnum.Error);

     
     

    Invocation.Builder builder = target.path("demos").path("jaxb").request();

    Response response = builder.post(Entity.entity(createParam, MediaType.APPLICATION_XML));

    if (response.getStatus() == 200) {

    DemoResult result = response.readEntity(DemoResult.class);

    System.out.println("result hasError=" + result.isHasError() + "\tmessage=" + result.getMessage());

    } else {

    System.out.println("response status=" + response.getStatus() + "\tmessage=" + response.getStatusInfo());

    }

    }

示例中的POJO类,都定义为XML的属性(property)来组织的,POJO的字段也可以作为元素(element)组织,如果REST请求的传输数据量很大,并且无须和外系统对接的场景,建议使用属性来组织XML,这样可以极大的减少XML格式的数据包大小。

注意:Jersey默认设置了XMLConstants.FEATURE_SECURE_PROCESSING属性,当属性和元素过多是,会报"well-formedness error"的警告信息,可以通过设置 MessageProperties.XML_SECURITY_DISABLE 参数值来屏蔽,设置示例如下:

  • REST服务设置

    // 继承ResouceConfig类,并增加属性设置

    public class RESTfulResourceConfig extends ResourceConfig {

    public RESTfulResourceConfig() {

    property(MessageProperties.XML_SECURITY_DISABLE, Boolean.TRUE);

    }

    }

  • 客户端设置

    ClientConfig clientConfig = new
    ClientConfig();

    clientConfig.property(MessageProperties.XML_SECURITY_DISABLE, Boolean.TRUE);

    Client c = ClientBuilder.newClient(clientConfig);

     
     

 
 

笔记:Jersey REST 传输格式-XML的更多相关文章

  1. 笔记:Jersey REST 传输格式

    通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.sho ...

  2. 笔记:Jersey REST 传输格式-JSON

    JSON 类型已经成为Ajax技术中数据传输的实际标准,Jersey 提供了多种处理JSON数据的包和解析方式,下表展示了JSON包和解析方式: 解析方式\JSON支持包 MOXy JSON-P Ja ...

  3. 001-RESTful服务最佳实践-RestFul准则、HTTP动词表示含义、合理的资源命名、响应格式XML和JSON

    一.概述 因为REST是一种架构风格而不是严格的标准,所以它可以灵活地实现.由于这种灵活性和结构自由度,对设计最佳实践也有很大的差异. API的方向是从应用程序开发人员的角度考虑设计选择. 幂等性 不 ...

  4. 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

     图解 TCP/IP  第六章 TCP与UDP   笔记6.1 传输层的作用   传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...

  5. [WEB API] CLIENT 指定请求及回应格式(XML/JSON)

    [Web API] Client 指定请求及响应格式(xml/json) Web API 支持的格式请参考 http://www.asp.net/web-api/overview/formats-an ...

  6. QT断点续传(原理:需要在HTTP请求的header中添加Rang节,告诉服务器从文件的那个位置开始传输.格式为bytes 开始传输的位置)

    //功能:    根据一个URL地址将数据保存到指定路径下,支持断点续传//参数:    url            --需要访问的URL地址//         SavePath       -- ...

  7. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式

    一.MPEG RTP音频传输 相较H264的RTP传输格式,MPEGE音频传输格式则简单许多. 每一包MPEG音频RTP包都前缀一个4字节的Header,如下图(RFC2550) “MBZ”必须为0( ...

  8. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(七)RTP音视频传输解析层之H264传输格式

    一.H264传输封包格式的2个概念 (1)组包模式(Packetization Modes) RFC3984中定义了3种组包模式:单NALU模式(Single Nal Unit Mode).非交错模式 ...

  9. XML系列之--对电文格式XML的简单操作(三)

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

随机推荐

  1. 如何在模拟器里体验微软HoloLens

    众所周知,微软的HoloLens以及MR设备售价都比较高,这让不少感兴趣的朋友们望而却步,本篇教程将向大家介绍如何在模拟器里体验传说中的HoloLens. 1.需要准备的硬件: 智能手机一台(WP.A ...

  2. PCI、CPCI、CPCIE 区别、特点

    PCI.CPCI.CPCIE 区别.特点 CPCI总线 •PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器 •(1) PCI总线空间与 ...

  3. YPbPr 和 YCbCr的区别 .

    这几天在做分量视频输入,涉及分量视频表示,接触到YPbPr和YCbCr的概念,发现不光自己的项目上,对这两个概念错乱,就是网上也充斥着大量错误的说法. 分量接口有两种名称YPbPr和YCbCr,这是两 ...

  4. 图像处理------泛洪填充算法(Flood Fill Algorithm) 油漆桶功能

    泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows paint的油漆桶功能.算法的原理很简单,就 ...

  5. TCP为何采用三次握手来建立连接,若采用二次握手可以吗

    1. TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的.基于IP的传输层协议,采用三次握手确认建立一个连接. TCP为 ...

  6. 【mongodb系统学习之六】mongodb配置文件方式启动

    六.mongodb可以用配置文件启动,配置文件配好后,每次指定文件就好,而不用每次写一长串: 1).创建配置文件: 2).配置(例如指定数据存储目录,日志存储文件,后台进程,端口号等): 3).配置文 ...

  7. 中断处理程序不能使用printf的本质

    vxworks 中断处理程序之所以不用printf,本质在于printf是将信息输出到标准输出设备(STDOUT)中, 整个标准输出设备是一个全局变量,由于有semTake操作,那么就会发生阻塞,vx ...

  8. 关于ios手机游览器针对overflow:hidden设置无效的解决办法

    Ordinarily, overflow: hidden; on the body tag is sufficient to prevent scrolling a web page, if for ...

  9. hdu5904 LCIS

    这题惩罚我这种经常不管常数的懒人 直接 1e6 TLE 如果1e5对数组枚举过 诶其实很想吐槽些伤心事,但是还是不想在博客上吐口水 不管今年比赛结果如何 请享受比赛 #include<bits/ ...

  10. Java中使用UDP实现简单的聊天功能

    通过DatagramSocket类来实现.此类表示用来发送和接收数据报包的套接字. 发送端代码如下: import java.io.IOException; import java.net.*; im ...