服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - springboot 接口返回字符串带引号的问题解决

springboot 接口返回字符串带引号的问题解决

2022-11-13 11:58Always_July Java教程

本文主要介绍了springboot 接口返回字符串带引号的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

框架版本

springboot 2.2.1.RELEASE
fastjson 1.2.78

maven pom.xml parent 和 dependencies

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>
    </dependencies>

问题

如下代码,返回结果是 "hello world",添加了一个双引号。

@RestController
@Slf4j
public class Hello1Controller {

    @GetMapping(value = "/printHello")
    @ResponseBody
    public String printHello() {
        return "hello world";
    }
}

排查

不管返回什么的结果,肯定经过MessageConvert进行消息的输出,debug看使用了哪一个MessageConvert

选择MessageConvert的方法是
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters(T, org.springframework.core.MethodParameter, org.springframework.http.server.ServletServerHttpRequest, org.springframework.http.server.ServletServerHttpResponse)

关键代码

        if (selectedMediaType != null) {
            selectedMediaType = selectedMediaType.removeQualityValue();
             // 打个断点在此处
            for (HttpMessageConverter<?> converter : this.messageConverters) {
                GenericHttpMessageConverter genericConverter = (converter instanceof GenericHttpMessageConverter ?
                        (GenericHttpMessageConverter<?>) converter : null);
                if (genericConverter != null ?
                        ((GenericHttpMessageConverter) converter).canWrite(targetType, valueType, selectedMediaType) :
                        converter.canWrite(valueType, selectedMediaType)) {
                    body = getAdvice().beforeBodyWrite(body, returnType, selectedMediaType,
                            (Class<? extends HttpMessageConverter<?>>) converter.getClass(),
                            inputMessage, outputMessage);
                    if (body != null) {
                        Object theBody = body;
                        LogFormatUtils.traceDebug(logger, traceOn ->
                                "Writing [" + LogFormatUtils.formatValue(theBody, !traceOn) + "]");
                        addContentDispositionHeader(inputMessage, outputMessage);
                        if (genericConverter != null) {
                            genericConverter.write(body, targetType, selectedMediaType, outputMessage);
                        }
                        else {
                            ((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage);
                        }
                    }
                    else {
                        if (logger.isDebugEnabled()) {
                            logger.debug("Nothing to write: null body");
                        }
                    }
                    return;
                }
            }
        }

debug发现我的messageConvert只有一个,是com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter。那肯定是经过FastJson将String 写到输出流。

springboot 接口返回字符串带引号的问题解决

debug查看FastJsonHttpMessageConverter具体的write 代码 ,可以看到此时输出字符串添加了引号。

方法:com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter#writeInternal

springboot 接口返回字符串带引号的问题解决

写个fastjson 转化字符串试试,如下结果输出是 "hello world",添加了引号。

import com.alibaba.fastjson.JSON;

public class JsonTest {
    public static void main(String[] args) {
        System.out.println(JSON.toJSONString("hello world"));
        // 
    }
}

问题所在

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer  {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setCharset(StandardCharsets.UTF_8);
        //设置允许返回为null的属性
        config.setSerializerFeatures(SerializerFeature.WriteMapNullValue);
       
        fastJsonConverter.setFastJsonConfig(config);
        List<MediaType> list = new ArrayList<>();
        list.add(MediaType.APPLICATION_JSON);
        fastJsonConverter.setSupportedMediaTypes(list);
        converters.add(fastJsonConverter);
    }

}

我配置了FastJsonHttpMessageConverter ,导致只使用FastJsonHttpMessageConverter 进行消息转换。

解决方法

添加StringHttpMessageConverter ,让其转化String。注意顺序,StringHttpMessageConverter 要在FastJsonHttpMessageConverter 之前。

 @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setCharset(StandardCharsets.UTF_8);
        //设置允许返回为null的属性
        config.setSerializerFeatures(SerializerFeature.WriteMapNullValue);

        fastJsonConverter.setFastJsonConfig(config);
        List<MediaType> list = new ArrayList<>();
        list.add(MediaType.APPLICATION_JSON);
        fastJsonConverter.setSupportedMediaTypes(list);

        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
        stringHttpMessageConverter.setSupportedMediaTypes(list);
        converters.add(stringHttpMessageConverter);

        converters.add(fastJsonConverter);
    }

springboot 接口返回字符串带引号的问题解决

返回数据没有引号了。

参考资料

【Spring】HttpMessageConverter的作用及替换

到此这篇关于springboot 接口返回字符串带引号的问题解决的文章就介绍到这了,更多相关springboot 返回字符串带引号内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://www.jianshu.com/p/569ed01ae671

延伸 · 阅读

精彩推荐
  • Java教程JavaMail邮件简介及API概述第一篇

    JavaMail邮件简介及API概述第一篇

    这篇文章主要为大家详细介绍了JavaMail邮件简介及API概述第一篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    汪先森4742020-07-17
  • Java教程Java jvm垃圾回收详解

    Java jvm垃圾回收详解

    这篇文章主要介绍了JVM的垃圾回收总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编...

    月亮的-影子7952022-03-01
  • Java教程身份证号码验证算法深入研究和Java实现

    身份证号码验证算法深入研究和Java实现

    这篇文章主要介绍了身份证号码验证算法深入研究和Java实现,本文讲解了18身份证号码的结构、根据17位数字本体码获取最后一位校验码程序实例等内容,需要...

    junjie5172019-12-24
  • Java教程使用栈的迷宫算法java版代码

    使用栈的迷宫算法java版代码

    这篇文章主要为大家详细介绍了使用栈的迷宫算法java版代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    young_leez3952021-03-25
  • Java教程详解Java的Struts框架中上传文件和客户端验证的实现

    详解Java的Struts框架中上传文件和客户端验证的实现

    这篇文章主要介绍了Java的Struts框架中上传文件和客户端验证的实现,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下 ...

    goldensun3962020-03-06
  • Java教程java实现文件重命名的方法

    java实现文件重命名的方法

    这篇文章主要介绍了java实现文件重命名的方法,涉及java针对文件的重命名操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    zzt06052912019-12-27
  • Java教程java根据模板动态生成PDF实例

    java根据模板动态生成PDF实例

    本篇文章主要介绍了java根据模板动态生成PDF实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Enlightenment2822020-09-20
  • Java教程Spring Boot使用Druid连接池的示例代码

    Spring Boot使用Druid连接池的示例代码

    Druid是Java语言中最好的数据库连接池。这篇文章主要介绍了Spring Boot使用Druid连接池的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    Real_man6852021-05-09