1. 程式人生 > >實現SpringMVC中使用@Responsebody註解返回任意POJO物件轉換成JSON

實現SpringMVC中使用@Responsebody註解返回任意POJO物件轉換成JSON

最近去實習,在第三天老大終於給個專案原始碼來學習學習了,很難得,然後在閱讀原始碼過程中,發現了很多值得學習的東西,比如一些規範、面向物件設計、框架使用等。
以前以為SpringMVC中使用@Responsebody註解後,只能返回JSONObject,今天讓我學到很多東西,原來只要是物件都能返回,只是我們需要把物件轉換成JSON型別的字串。

一、核心依賴jar包:

我這裡使用的是maven,so附上maven依賴配置。

<properties>
  <jackson.version>2.7.3</jackson.version>
</properties
>
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>
jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency
>

上述jar包核心作用是把java物件轉換成json字串。

二、自定義java物件

@JsonInclude(JsonInclude.Include.NON_NULL)//不包含有null值的欄位,即欄位值為null的轉換為json字串時會被省略
public class User{
    @JsonProperty("user_name")//設定該欄位轉換為json後的欄位名
    private String name;
    private int age;
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
}

上面定義的這個user類,使用ObjectMapper.writeValueAsString(user)方法轉換會返回一個json字串,例如:{“user_name”:”xyh”,”age”:22}
ObjectMapper類在maven配置的依賴jar包中。
好了,看到這裡估計很多人都會有點猜測是怎麼做到返回任意物件轉換成json寫到響應體了。

三、自定義HttpMessageConverter繼承MappingJackson2HttpMessageConverter

很多做過在SpringMVC的朋友應該都知道需要配置MessageConverter,我們這裡由於是返回任意POJO物件,so我們需要繼承MappingJackson2HttpMessageConverter重寫writeInternal方法,例:

public class MyHttpMessageConverter implements MappingJackson2HttpMessageConverter{
@Override
    protected void writeInternal (Object object,
                                 HttpOutputMessage outputMessage) throws IOException,
            HttpMessageNotWritableException {
        // 使用 Jackson 的 ObjectMapper 將 Java 物件轉換成 Json String
        ObjectMapper mapper = new ObjectMapper ();
        String json = mapper.writeValueAsString (object);
        outputMessage.getBody().write (json.getBytes ());
    }
};

object是我們mvc的controller返回的物件,
outputMessage物件的getBody ()方法可以獲取到Response體的輸出流物件。
還有就是,如果有需要的朋友,可以在在這裡給json字串加密,這樣就能實現加密傳輸了,當然了,現在有https。
到這裡還差最後一步,配置MVC註解驅動,配置上面我們自定義的轉換器

<mvc:annotation-driven >
    <mvc:message-converter register-defaults="true">
        <bean class="com.xyh.converter.MyHttpMessageConverter"/>
    </mvc:message-converter>
</mvc:annotation-driven>

大功告成!!!!