場景:公司使用springmvc @ResponseBody返回json,由於接口數據比較多,需要對數據進行一次壓縮
解決方案:
1.通過繼承 AbstractHttpMessageConverter,重寫 writeInternal,處理需要返回的數據
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import com.hhly.base.util.GzipUtil; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.Charset; public class JsonZipMessageConvert extends AbstractHttpMessageConverter<Object> { public final static Charset UTF8 = Charset.forName("UTF-8"); private Charset charset = UTF8; private SerializerFeature[] features = new SerializerFeature[0]; public JsonZipMessageConvert() { super(new MediaType("application", "json", UTF8), new MediaType("application", "*+json", UTF8)); } @Override protected boolean supports(Class<?> clazz) { return true; } public Charset getCharset() { return this.charset; } public void setCharset(Charset charset) { this.charset = charset; } public SerializerFeature[] getFeatures() { return features; } public void setFeatures(SerializerFeature... features) { this.features = features; } @Override protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream in = inputMessage.getBody(); byte[] buf = new byte[1024]; for (; ; ) { int len = in.read(buf); if (len == -1) { break; } if (len > 0) { baos.write(buf, 0, len); } } byte[] bytes = baos.toByteArray(); return JSON.parseObject(bytes, 0, bytes.length, charset.newDecoder(), clazz); } @Override protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { OutputStream out = outputMessage.getBody(); String text = JSON.toJSONString(obj, features); //這里做一次壓縮處理 String gzip = GzipUtil.gZip(text); byte[] bytes = gzip.getBytes(charset); out.write(bytes); } }
2.在springmvc servlet.xml增加以下代碼
<mvc:annotation-driven>
<mvc:message-converters>
<!--<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">-->
<bean class="com.base.strutsext.JsonZipMessageConvert">
<property name="supportedMediaTypes">
<list>
<value>application/json</value>
</list>
</property>
<property name="features">
<list>
<value>DisableCircularReferenceDetect</value>
<value>WriteMapNullValue</value>
<value>WriteNullListAsEmpty</value>
<value>WriteNullStringAsEmpty</value>
<value>WriteNullNumberAsZero</value>
<value>WriteNullBooleanAsFalse</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
