《Apache Dubbo微服务开发从入门到精通》——通信协议—— 四、 Rest协议(2) https://developer.aliyun.com/article/1224568
7) XML数据格式
由于JAX-RS的实现一般都用标准的JAXB(Java API for XML Binding)来序列化和反序列化XML格式数据,所以我们需要为每一个要用XML传输的对象添加一个类级别的JAXB annotation,否则序列化将报错。例如为getUser()中返回的User添加如下:
此外,如果service方法中的返回值是Java的primitive类型(如int,long,float,double等),最好为它们添加一层wrapper对象,因为JAXB不能直接序列化primitive类型。
例如,我们想让前述的registerUser()方法返回服务器端为用户生成的ID号:
由于primitive类型不被JAXB序列化支持,所以添加一个wrapper对象:
并修改service方法:
这样不但能够解决XML序列化的问题,而且使得返回的数据都符合XML和JSON的规范。例如,在JSON中,返回的将是如下形式:
如果不加wrapper,JSON返回值将直接是:
而在XML中,加wrapper后返回值将是:
这种wrapper对象其实利用所谓Data Transfer Object(DTO)模式,采用DTO还能对传输数据做更多有用的定制。
8) 定制序列化
如上所述,REST的底层实现会在service的对象和JSON/XML数据格式之间自动做序列化/反序列化。但有些场景下,如果觉得这种自动转换不满足要求,可以对其做定制。
Dubbo中的REST实现是用JAXB做XML序列化,用Jackson做JSON序列化,所以在对象上添加JAXB或Jackson的annotation即可以定制映射。
例如,定制对象属性映射到XML元素的名字:
定制对象属性映射到JSON字段的名字:
更多资料请参考JAXB和Jackson的官方文档,或自行google。
《Apache Dubbo微服务开发从入门到精通》——通信协议—— 四、 Rest协议(4) https://developer.aliyun.com/article/1224565