springmvc中messageConverter用法


解決StringHttpMessageConverter亂碼問題
問題:

當我們將字符串對象通過springmvc傳回瀏覽器時,因為StringHttpMessageConverter消息轉換器中默認的解碼集是ISO-8859-1;因為當瀏覽器接收時,是亂碼的.

解決:

通過配置文件,可以將問題解決:

<mvc:annotation-driven>
<!-- register-defaults="true"將我們配置文件創建的bean設置為默認的,springmvc就不會再后台創建了 -->
<!-- 屬性解釋:
1.register-defaults=true:告訴Springmvc使用我們配置文件創建的對象,不再自己創建(框架自己創建,是通過無參構造,會使用默認的字符集)
2.index="0" value="UTF-8":配置的是 defaultCharset 屬性,設置為UTF-8
-->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" value="UTF-8"></constructor-arg>
</bean>
</mvc:message-converters>

</mvc:annotation-driven>
1
2
3
4
5
6
7
8
9
10
11
12
13
重寫MappingJackson2HttpMessageConverter
解析

該消息轉換器的功能是:springmvc將對象轉換成JSON格式的字符串輸出

問題

在特殊情況下如果我們需要擴展返回的字符串格式

解決方案

寫一個自定義類,繼承該轉換器,重寫writeInternal(Object object, HttpOutputMessage outputMessage)方法,最后通過配置文件將該消息轉換器替換為我們自定義的:

第一步:自定義類

package com.taotao.springmvc.json;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonProcessingException;

/**
* MappingJackson2HttpMessageConverter將返回String轉換成JSON對象
* @author XSOOY
*
*/
public class CallbackMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

// 做jsonp的支持的標識,在請求參數中加該參數
private String callbackName;

@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
// 從threadLocal中獲取當前的Request對象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String callbackParam = request.getParameter(callbackName);
if(StringUtils.isEmpty(callbackParam)){
// 沒有找到callback參數,直接返回json數據
super.writeInternal(object, outputMessage);
}else{
JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
try {
/*擴展需要返回的字符串,
super.getObjectMapper()獲得ObjectMapper對象,該對象功能是將
對象轉成json格式
擴展后:"方法名(json格式字符串對象);"
*/
String result =callbackParam+"("+super.getObjectMapper().writeValueAsString(object)+");";
//擴展好后通過流返回瀏覽器
IOUtils.write(result, outputMessage.getBody(),encoding.getJavaName());
}
catch (JsonProcessingException ex) {
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
}
}

}

public String getCallbackName() {
return callbackName;
}

public void setCallbackName(String callbackName) {
this.callbackName = callbackName;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
第二步:配置文件
<mvc:annotation-driven>
<!-- register-defaults="true"將我們配置文件創建的bean設置為默認的,springmvc就不會再后台創建了 -->
<!--
CallbackMappingJackson2HttpMessageConverter繼承了MappingJackson2HttpMessageConverter類
重寫了writeInternal()方法,加強了轉json的功能,如:原來是xxx編程:callback(xxx);

屬性解釋:
name="callbackName" value="callback":定義回調函數方法名,根據前端確定的方法名來定義
-->
<mvc:message-converters register-defaults="true">
<bean class="com.taotao.springmvc.json.CallbackMappingJackson2HttpMessageConverter">
<property name="callbackName" value="callback"></property>
</bean>
</mvc:message-converters>

</mvc:annotation-driven>
---------------------
作者:不瘦夢想家
來源:CSDN
原文:https://blog.csdn.net/u014012384/article/details/54973752
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM