REST 處理 JSON 和 XML

2018-08-08 13:50 更新

一個(gè) POJO 對(duì)象

為了項(xiàng)目更加清晰,我們建立 com.waylau.rest.bean,在該包下面創(chuàng)建一個(gè) POJO 對(duì)象 MyBean:

public class MyBean {

    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

JSON 處理

我們想把這個(gè)對(duì)象返回給客戶(hù)端,在 MyResource 資源下,寫(xiě)了

/**
 * 方法處理 HTTP GET 請(qǐng)求。返回的對(duì)象以"application/json"媒體類(lèi)型
 * 給客戶(hù)端
 *
 * @return MyPojo 以 application/json 形式響應(yīng)
 */
@GET
@Path("pojojson")
@Produces(MediaType.APPLICATION_JSON)
public MyBean getPojoJson() {
    MyBean pojo = new MyBean();
    pojo.setName("waylau.com");
    pojo.setAge(28);
    return pojo;
}

其中 @Produces(MediaType.APPLICATION_XML)意思是以 JSON 形式將對(duì)象返回給客戶(hù)端。

在 index.jsp 里面,我們寫(xiě)了一個(gè)調(diào)用該 API 的方法

<p><a href="webapi/myresource/pojojson">POJO JSON</a>

啟動(dòng)項(xiàng)目,點(diǎn)擊“POJO JSON”,后臺(tái)提示如下錯(cuò)誤

org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
SEVERE: MessageBodyWriter not found for media type=application/json, type=class com.waylau.rest.bean.MyPojo, genericType=class com.waylau.rest.bean.MyPojo.

那是因?yàn)?POJO 對(duì)象未被序列化成 JSON 對(duì)象,所以找不到,下面介紹幾種常用的序列化手段。

采用 MOXy

需要添加 jersey-media-moxy 依賴(lài)庫(kù)在你的 pom.xml 來(lái)使用 MOXy

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>

由于 JSON 綁定特性是在自動(dòng)發(fā)現(xiàn)的列表里,所以無(wú)需再注冊(cè)該特性就使用了。(關(guān)于“自動(dòng)發(fā)現(xiàn)”,詳見(jiàn)《Jersey 2.x 用戶(hù)指南》“4.3.自動(dòng)發(fā)現(xiàn)的特性”一節(jié))

啟動(dòng)項(xiàng)目,點(diǎn)擊“POJO JSON”,頁(yè)面輸出

{"age":28,"name":"waylau.com"}

handle-json-xml-01

采用 Jackson (2.x)

使用 Jackson 2.x 需添加 jersey-media-json-jackson 模塊到 pom.xml:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
</dependency>

XML 處理

我們想把這個(gè)對(duì)象返回給客戶(hù)端,在 MyResource 資源下,寫(xiě)了

/**
 * 方法處理 HTTP GET 請(qǐng)求。返回的對(duì)象以"application/xml"媒體類(lèi)型
 * 給客戶(hù)端
 *
 * @return MyPojo 以 application/xml 形式響應(yīng)
 */
@GET
@Path("pojoxml")
@Produces(MediaType.APPLICATION_XML)
public MyBean getPojoXml() {
    MyBean pojo = new MyBean();
    pojo.setName("waylau.com");
    pojo.setAge(28);
    return pojo;
}

其中 @Produces(MediaType.APPLICATION_XML)意思是以 XML 形式將對(duì)象返回給客戶(hù)端

在 index.jsp 里面,我們寫(xiě)了一個(gè)調(diào)用該 API 的方法

<p><a href="webapi/myresource/pojoxml">POJO XML</a>

啟動(dòng)項(xiàng)目,點(diǎn)擊“POJO XML”,后臺(tái)提示如下錯(cuò)誤

org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
SEVERE: MessageBodyWriter not found for media type=application/xml, type=class com.waylau.rest.bean.MyPojo, genericType=class com.waylau.rest.bean.MyPojo.

那是因?yàn)?POJO 對(duì)象未被序列化成 XML 對(duì)象,所以找不到,解決方法很簡(jiǎn)單,在 MyBean 上面加上@XmlRootElement注解即可

@XmlRootElement
public class MyBean {

    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

@XmlRootElement 作用是將一個(gè)類(lèi)或一個(gè)枚舉類(lèi)型映射為一個(gè) XML 元素。

再次啟動(dòng)項(xiàng)目,點(diǎn)擊“POJO XML”,顯示正常

handle-json-xml-02

源碼

見(jiàn) handle-json-xml項(xiàng)目。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)