實現SpringMVC中使用@Responsebody註解返回任意POJO物件轉換成JSON
阿新 • • 發佈:2019-01-29
最近去實習,在第三天老大終於給個專案原始碼來學習學習了,很難得,然後在閱讀原始碼過程中,發現了很多值得學習的東西,比如一些規範、面向物件設計、框架使用等。
以前以為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>
大功告成!!!!