在学习Spring的时候看到可以使用@RequestBody 和@ResponseBody注解来是的Spring自动将http 其中的 body(json格式)部分和java内部的类进行转换。同时由于Google Gson的强大一般开发的时候会用的比较多,但是由于Spring内部默认使用的json的message Converter 并不是gson,所以这里需要配置一下才能使其生效;
Spring其实已经在实现了对gson的支持,但是如果想在项目中使用,还需要通过配置一下才可以:
配置文件如下:
<!--<mvc:annotation-driven/>-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.GsonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
其中org.springframework.http.converter.json.GsonHttpMessageConverter
是Spring已经实现了的,在spring的包中能找到这个类。
注:如果想要某中类型的数据能被Message Converter转换,需要自己实现AbstractGenericHttpMessageConverter
这个接口,然后在通过配置文件将这个类加载进你的项目中(比如说alibaba:fastjson,在它包中也实现了度spring message converter 的支持)。
备注: 网上有很多实现自己的Message Converter的教程,如果后续需要可以搜一下,实现起来有两个步骤:
需要自己实现AbstractGenericHttpMessageConverter
这个接口;
通过xml或者其他方法配置一下
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.GsonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
?
#在pom下加入依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
一下贴点源码:
package org.springframework.http.converter.json;
?
import com.google.gson.Gson;
import com.google.gson.JsonIOException;
import com.google.gson.JsonParseException;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractGenericHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.Assert;
?
public class GsonHttpMessageConverter extends AbstractGenericHttpMessageConverter<Object> {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private Gson gson = new Gson();
private String jsonPrefix;
?
public GsonHttpMessageConverter() {
super(new MediaType[]{MediaType.APPLICATION_JSON, new MediaType("application", "*+json")});
this.setDefaultCharset(DEFAULT_CHARSET);
}
?
public void setGson(Gson gson) {
Assert.notNull(gson, "‘gson‘ is required");
this.gson = gson;
}
?
public Gson getGson() {
return this.gson;
}
?
public void setJsonPrefix(String jsonPrefix) {
this.jsonPrefix = jsonPrefix;
}
?
public void setPrefixJson(boolean prefixJson) {
this.jsonPrefix = prefixJson?")]}‘, ":null;
}
?
public boolean canRead(Class<?> clazz, MediaType mediaType) {
return this.canRead(mediaType);
}
?
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return this.canWrite(mediaType);
}
?
protected boolean supports(Class<?> clazz) {
throw new UnsupportedOperationException();
}
?
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
TypeToken<?> token = this.getTypeToken(clazz);
return this.readTypeToken(token, inputMessage);
}
?
public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
TypeToken<?> token = this.getTypeToken(