springmvc中messageConverter用法

解决StringHttpMessageConverter乱码问题

  1. 问题:

    当我们将字符串对象通过springmvc传回浏览器时,因为StringHttpMessageConverter消息转换器中默认的解码集是ISO-8859-1;因为当浏览器接收时,是乱码的.

  2. 解决:

    通过配置文件,可以将问题解决:

<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>

重写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;
    }

}
  • 第二步:配置文件
<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>
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值