[alibaba/fastjson]版本1.2.41配置FastJsonpResponseBodyAdvice后jsonp请求返回数据中文乱码

2025-11-11 21 views
2

版本1.2.41配置FastJsonpResponseBodyAdvice后,jsonp请求返回数据中文乱码, 如果不是jsonp请求就不会乱码! ` @Configuration public class FastJsonConverterConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { //创建fastJson的消息转换器 FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); //创建配置类 FastJsonConfig fastJsonConfig = new FastJsonConfig(); //修改配置返回内容的过滤 fastJsonConfig.setSerializerFeatures( SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.DisableCircularReferenceDetect ); //配置时间转换 SerializeConfig serializeConfig = new SerializeConfig(); String dateFormat = "yyyy-MM-dd HH:mm:ss"; serializeConfig.put(Timestamp.class, new SimpleDateFormatSerializer(dateFormat)); fastJsonConfig.setSerializeConfig(serializeConfig); //处理中文乱码问题 List fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); //消息转换器装载中文乱码配置 fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); //消息转换器装载fastJson配置 fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); converters.add(fastJsonHttpMessageConverter); //调用父类的配置 super.configureMessageConverters(converters); }

@Bean
public FastJsonpResponseBodyAdvice fastJsonpResponseBodyAdvice() {
    return new FastJsonpResponseBodyAdvice();
}

}`

回答

7

问题出在 jsonp时输出的不是 APPLICATION_JSON_UTF8, 而是APPLICATION_JAVASCRIPT = new MediaType("application", "javascript");

试试用 FastJsonpHttpMessageConverter4 吧

4

试了FastJsonpHttpMessageConverter4,和fastJsonHttpMessageConverter一样还是在jsonp请求时出现中文乱码。 `@Configuration public class FastJsonConverterConfig extends WebMvcConfigurerAdapter {

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    //创建fastJson的消息转换器
    //创建配置类
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    //修改配置返回内容的过滤
    fastJsonConfig.setSerializerFeatures(
            SerializerFeature.WriteNullNumberAsZero,
            SerializerFeature.WriteMapNullValue,
            SerializerFeature.WriteNullListAsEmpty,
            SerializerFeature.WriteNullStringAsEmpty,
            SerializerFeature.DisableCircularReferenceDetect
    );
    //配置时间转换
    SerializeConfig serializeConfig = new SerializeConfig();
    String dateFormat = "yyyy-MM-dd HH:mm:ss";
    serializeConfig.put(Timestamp.class, new SimpleDateFormatSerializer(dateFormat));
    fastJsonConfig.setSerializeConfig(serializeConfig);
    //处理中文乱码问题
    List<MediaType> fastMediaTypes = new ArrayList<>();
    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    //消息转换器装载中文乱码配置
    //fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
    //消息转换器装载fastJson配置
    //fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
    //converters.add(fastJsonHttpMessageConverter);

    //jsonP信息转换
    FastJsonpHttpMessageConverter4 fastJsonpHttpMessageConverter4 = new FastJsonpHttpMessageConverter4();
    fastJsonpHttpMessageConverter4.setFastJsonConfig(fastJsonConfig);
    fastJsonpHttpMessageConverter4.setSupportedMediaTypes(fastMediaTypes);
    converters.add(fastJsonpHttpMessageConverter4);
    //调用父类的配置
    super.configureMessageConverters(converters);
}

@Bean
public FastJsonpResponseBodyAdvice fastJsonpResponseBodyAdvice() {
    return new FastJsonpResponseBodyAdvice("callback","jsonp");
}

}`

6

@lichong2 建议使用注解 @ResponseJSONPJSONPResponseBodyAdvice

8

问题出在 jsonp时输出的不是 APPLICATION_JSON_UTF8, 而是APPLICATION_JAVASCRIPT = new MediaType("application", "javascript");

试试用 FastJsonpHttpMessageConverter4 吧

问题确实是这个问题, 但是FastJsonpHttpMessageConverter4 已经被标记为Deprecated。 而且也是解决不了问题。 就算是使用:@ResponseJSONP 和 JSONPResponseBodyAdvice 还是不可以解决问题。 从原理上来说,还是需要通过指定 Response 的 Content-Type:application/javascript;charset=utf-8。 低版本倒是没有问题。还是希望官方解决。 APPLICATION_JAVASCRIPT = new MediaType("application", "javascript", Charsets.UTF_8);

2

@leokongwq 这个问题在于jsonp其实是javascript, 并不是json。 所以contentType采用javascript其实是正确的。

5

@neil4dong contentType 指定为 application/javascript 没有问题,但只是简单的设定为 application/javascript 就会把 MediaType 的 Charset 信息丢掉,这样会导致乱码问题;希望提供一个给 jsonp 格式设置编码的接口,由使用方来设定 Charset 信息;

7

@kakakeven 最终响应的Charset不取决于JSONPResponseBodyAdvice 的操作, JSONPResponseBodyAdvice 仅仅只是将返回结果做了封装, 实际响应Charset是取决于FastJsonHttpMessageConverter中的Charset配置。

如果有出现错误的例子,请问方便给一个testcase吗

5

我也遇到了同样的问题,现在有什么解决办法吗

8

@kakakeven 最终响应的Charset不取决于JSONPResponseBodyAdvice 的操作, JSONPResponseBodyAdvice 仅仅只是将返回结果做了封装, 实际响应Charset是取决于FastJsonHttpMessageConverter中的Charset配置。

如果有出现错误的例子,请问方便给一个testcase吗

返回的ContentType只有application/javascript,没有charset,已经在fastjson上设置了DefalutCharset,和SupportMediaType,也在RequestMapping上设置过producer,都没有用,只能手动在HttpServletResponse上设置Content-type 我的解决方法