Spring @responsebody返回json字符串乱码 or 请求406

本文详细解析了Spring MVC中返回JSON字符串时出现乱码的原因,主要是由于StringHttpMessageConverter默认编码为ISO-8859-1导致。文章提供了通过配置文件自定义StringHttpMessageConverter及其支持的媒体类型来解决该问题的方法。
  • 由于项目中每个人喜欢返回的东西不一样,有的人返回json字符串,有的就直接@response注解返回对应的类型。但是Spring对字符串转换和对象转换使用不同转换器。String转换器,默认转换编码ISO-8859-1,
    对象转换器默认转编码utf-8。
  • 出现http响应吗406,一种可能是我们没有配置对象转换器,还有可能就是缺少了对应的转换的jackson包。 启用
    @Responsebody注解 将采用默认的转换器。
/**
     * Adds a set of default HttpMessageConverter instances to the given list.
     * Subclasses can call this method from {@link #configureMessageConverters(List)}.
     * @param messageConverters the list to add the default message converters to
     */
    protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
        stringConverter.setWriteAcceptCharset(false);

        messageConverters.add(new ByteArrayHttpMessageConverter());
        messageConverters.add(stringConverter);
        messageConverters.add(new ResourceHttpMessageConverter());
        messageConverters.add(new SourceHttpMessageConverter<Source>());
        messageConverters.add(new AllEncompassingFormHttpMessageConverter());
        if (romePresent) {
            messageConverters.add(new AtomFeedHttpMessageConverter());
            messageConverters.add(new RssChannelHttpMessageConverter());
        }
        if (jaxb2Present) {
            messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
        }
        if (jackson2Present) {
            messageConverters.add(new MappingJackson2HttpMessageConverter());
        }
        else if (jacksonPresent) {
            messageConverters.add(new MappingJacksonHttpMessageConverter());
        }
    }

查看源码发现启用注解有很多类型的转换器。StringHttpMessageConverter类型的转换器默认编码

StringHttpMessageConverter
所以当返回String类型的json字符串,只启用注解的话就会乱码。

解决方法

  • 在配置文件中配置StringHttpMessageConverter
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean
                    class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json;charset=UTF-8</value>
                            <value>text/plain;charset=UTF-8 </value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

注解必须放在配置之后。否则启用的还是默认的转换器。如果你还想配置对象转换器还需要在加MappingJacksonHttpMessageConverter

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean
                    class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json;charset=UTF-8</value>
                            <value>text/plain;charset=UTF-8 </value>
                        </list>
                    </property>
                </bean>
                <bean id="mappingJacksonHttpMessageConverter"
                    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

当然你也可以注解只用对象转化器因为面向对象嘛。

Spring MVC 中,当使用 `@ResponseBody` 注解返回 `String` 类型值时,Spring 会使用 `StringHttpMessageConverter` 来处理响应内容。默认情况下,`StringHttpMessageConverter` 使用的字符集是 `ISO-8859-1` 编码[^3]。这可能导致在返回包含中文字符的字符串时出现乱码问题。 为了解决这个问题,可以通过自定义 `StringHttpMessageConverter` 的字符集为 `UTF-8` 来确保正确处理中文字符。在配置文件中,可以对 `<mvc:annotation-driven>` 标签进行扩展,通过 `<mvc:message-converters>` 配置项替换默认的字符集: ```xml <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8" /> </bean> </mvc:message-converters> </mvc:annotation-driven> ``` 通过上述配置,`StringHttpMessageConverter` 将使用 `UTF-8` 字符集对返回字符串进行编码,从而避免中文乱码问题[^2]。 此外,如果控制器方法返回的是非 `String` 类型的数据(例如 `Map` 或自定义对象),Spring MVC 会自动将其序列化为客户端请求的内容类型,如 JSON 或 XML。例如,如果客户端请求的是 JSON 数据,Spring MVC 会将返回值转换为 JSON 格式并返回给客户端[^1]。 ### 示例代码 以下是一个典型的控制器方法示例,展示如何通过 `@ResponseBody` 返回 `String` 类型值: ```java @Controller public class ExampleController { @GetMapping("/greet") @ResponseBody public String greet() { return "你好,世界!"; // 返回的中文字符串 } } ``` 若未配置字符集为 `UTF-8`,客户端可能会接收到乱码的中文响应内容。通过配置 `StringHttpMessageConverter` 使用 `UTF-8` 编码,可以确保返回字符串在客户端正确显示。 ### 总结 - `@ResponseBody` 返回 `String` 类型时,默认使用 `ISO-8859-1` 编码,可能导致中文乱码。 - 通过配置 `StringHttpMessageConverter` 使用 `UTF-8` 编码,可以解决乱码问题。 - 对于非 `String` 类型的返回值,Spring MVC 会根据客户端请求的内容类型进行序列化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值