spring mvc 返回字符串带双引号及StringHttpMessageConverter乱码处理

本文介绍如何解决SpringMVC使用@ResponseBody返回字符串时出现的乱码问题,通过配置StringHttpMessageConverter设置字符集为UTF-8,并展示了两种配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载自:http://blog.youkuaiyun.com/wangyangbto/article/details/48804155

很多人都碰到过,SpringMVC使用 @ResponseBody 注解,返加字符串不做任何处理时,有可能会出现乱码问题。

这是由于 StringHttpMessageConverter 类中,默认采用的字符集是 ISO-8859-1。

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

   public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");


   private final Charset defaultCharset;

   private final List<Charset> availableCharsets;

   private boolean writeAcceptCharset = true;


   /**
    * A default constructor that uses {@code "ISO-8859-1"} as the default charset.
    * @see #StringHttpMessageConverter(Charset)
    */
   public StringHttpMessageConverter() {
      this(DEFAULT_CHARSET);
   }

那么要解决乱码问题,需要改变 StringHttpMessageConverter 中的默认字符集,本文中以UTF-8为例。

修改默认字付集:

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
    <constructor-arg value="UTF-8" index="0"/>
    <property name="supportedMediaTypes">
        <list>
            <value>text/plain;charset=UTF-8</value>
        </list>
    </property>
</bean>

配置起效

方式一:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="stringHttpMessageConverter"/>
            <ref bean="jackson2HttpMessageConverter"/>
        </list>
    </property>
</bean>

<mvc:annotation-driven />

注:配置必须在 <mvc:annotation-driven /> 之前,否则将不会启效;<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter。

方式二:

<mvc:annotation-driven>
    <mvc:message-converters>
        <ref bean="stringHttpMessageConverter"/>
        <ref bean="jackson2HttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

 

接下来的内容转载自:http://blog.youkuaiyun.com/flushest/article/details/52755785

spring mvc中没有直接使用默认配置,而是另外配置了json解析器

 <!-- 返回json  需要导入 fastjson.jar包 -->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="false">
            <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <!-- 这里顺序不能反,一定先写text/html,不然ie下出现下载提示 -->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

使用@responsebody注解并且返回值类型为String时,返回的string字符串带有双引号,其原因是直接将string类型转成了json字符串,应该在json解析器之前添加字符串解析器

<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>

 

@PostMapping(value = "/compare",consumes = "multipart/form-data") public R compare(@RequestParam("File") MultipartFile file, @RequestParam("jsonContent") String jsonContent) { //读取PDF文本 String pdfText = compareService.extractContent(file); //解析JSON配置 JsonNode jsonConfig = null; try { jsonConfig = compareService.parseJson(jsonContent); } catch (Exception e) { return R.fail(MessageUtils.message("failed.convert.json")); } //执行对比校验 List<ValidationResult> results = compareService.compareContent(pdfText, jsonConfig); //返回没有匹配成功的数据 List<ValidationResult> failedResults = new ArrayList<>(); for (ValidationResult result : results) { if (!result.isValid()) { failedResults.add(result); } } if (failedResults.isEmpty()) { return R.ok("条件符合规范"); } else { return R.ok(failedResults); } }我在apifox这个软件测试 报错java.lang.IllegalArgumentException: Invalid character found in the request target [/pdfJson/compare?jsonContent=[%20%20%7B%20%20%20%20%22DELIVERYNO%22:%20%22QBA7074052%22,%20%20%20%20%22CARRIERCODE%22:%20%22XDESC%22,%20%20%20%20%22SHIPCONDITDESC%22:%20%22ROAD%22,%20%20%20%20%22SOLDTONAME%22:%20%22%E6%B7%B1%E5%9C%B3%E5%B8%82%E5%A4%A9%E8%81%94%E7%BB%88%E7%AB%AF%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%22,%20%20%20%20%22SOLDTOCOMPANY%22:%20%22%22,%20%20%20%20%22SHIPTONAME%22:%20%22%E6%B7%B1%E5%9C%B3%E5%B8%82%E5%A4%A9%E8%81%94%E7%BB%88%E7%AB%AF%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E4%B8%8A%E6%B5%B7%E5%BA%93%22,%20%20%20%20%22SHIPTOCOMPANY%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS%22:%20%22%E5%98%89%E5%AE%9A%E5%8C%BA%E5%85%B4%E9%82%A6%E8%B7%AF1166%E5%8F%B7%22,%20%20%20%20%22SHIPTOADDRESS2%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS3%22:%20%22%22,%20%20%20%20%22SHIPTOADDRESS4%22:%20%22%22,%20%20%20%20%22SHIPTOCITY%22:%20%22%E4%B8%8A%E6%B5%B7%22,%20%20%20%20%22SHIPTOSTATE%22:%20%22%E4%B8%8A%E6%B5%B7%22,%20%20%20%20%22SHIPTOZIP%22:%20201800,%20%20%20%20%22SHIPTOCOUNTRY%22:%20%22%E4%B8%AD%E5%9B%BD%22,%20%20%20%20%22SHIPINSTRUCT%22:%20%22%22,%20%20%20%20%22CUSTWHINST%22:%20%22%22,%20%20%20%20%22EXCUSTNOTE%22:%20%22%22,%20%20%20%20%22EXCUSTNOTE1%22:%20%22%22,%20%20%20%20%22SHIPDATE%22:%20%2213-MAY-2025%22,%20%20%20%20%22SOLDTOADDRESS%22:%20%22%E5%89%8D%E6%B9%BE%E4%B8%80%E8%B7%AF1%E5%8F%B7A%E6%A0%8B201%E5%AE%A4%22,%20%20%20%20%22SOLDTOADDRESS3%22:%20%22%22,%20%20%20%20%22SOLDTOADDRESS2%22:%20%22%22,%20%20%20%20%22SOLDTOCITY%22:%20%22%E6%B7%B1%E5%9C%B3%22,%20%20%20%20%22SOLDTOADDRESS4%22:%20%22%22,%20%20%20%20%22SOLDTOSTATE%22:%20%22%E5%B9%BF%E4%B8%9C%22,%20%20%20%20%22SOLDTOZIP%22:%20518000,%20%20%20%20%22SOLDTOCOUNTRY%22:%20%22%E4%B8%AD%E5%9B%BD%22,%20%20%20%20%22TOTALCARTONQTY%22:%2020,%20%20%20%20%22TOTALQTY%22:%20160,%20%20%20%20%22TOTALWEIGHT%22:%20%2273.94%20KGS%22,%20%20%20%20%22V_CUBE%22:%200.22%20%20%7D] ]. The valid characters are defined in RFC 7230 and RFC 3986 后端
最新发布
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值