最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot 接口返回字符串帶引號的問題解決

 更新時間:2022年04月15日 09:54:45   作者:Always_July  
本文主要介紹了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";
    }
}

排查

不管返回什么的結果,肯定經(jīng)過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發(fā)現(xiàn)我的messageConvert只有一個,是com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter。那肯定是經(jīng)過FastJson將String 寫到輸出流。

debug查看FastJsonHttpMessageConverter具體的write 代碼 ,可以看到此時輸出字符串添加了引號。

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

寫個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);
    }

返回數(shù)據(jù)沒有引號了。

參考資料

【Spring】HttpMessageConverter的作用及替換

到此這篇關于springboot 接口返回字符串帶引號的問題解決的文章就介紹到這了,更多相關springboot 返回字符串帶引號內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中序列化與反序列化的特性解讀

    Java中序列化與反序列化的特性解讀

    這篇文章主要介紹了Java中序列化與反序列化的特性解讀,當我們需要將內存中的對象持久化到磁盤,數(shù)據(jù)庫中時, 當我們需要與瀏覽器進行交互時,當我們需要實現(xiàn) RPC 時, 這個時候就需要序列化和反序列化了,需要的朋友可以參考下
    2023-08-08
  • Java處理多API請求的方法詳解

    Java處理多API請求的方法詳解

    Java?中的并發(fā)是指語言并行運行多個線程的能力,允許同時執(zhí)行多個任務,
    2023-10-10
  • 分享java中設置代理的兩種方式

    分享java中設置代理的兩種方式

    有時候我們的程序中要提供可以使用代理訪問網(wǎng)絡,代理的方式包括http、https、ftp、socks代理。比如在IE瀏覽器設置代理,這里簡單介紹下,需要的朋友可以參考下
    2015-12-12
  • Spring Security OAuth2 授權碼模式的實現(xiàn)

    Spring Security OAuth2 授權碼模式的實現(xiàn)

    這篇文章主要介紹了Spring Security OAuth2 授權碼模式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • java判斷中文字符串長度的簡單實例

    java判斷中文字符串長度的簡單實例

    下面小編就為大家?guī)硪黄猨ava判斷中文字符串長度的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • idea中無法自動裝配未找到 ‘XXXXXXX‘ 類型的 Bean

    idea中無法自動裝配未找到 ‘XXXXXXX‘ 類型的 Bean

    本文主要介紹了idea中無法自動裝配未找到 ‘XXXXXXX‘ 類型的 Bean的原因及三種解決方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Spring中@RequestParam、@RequestBody和@PathVariable的用法詳解

    Spring中@RequestParam、@RequestBody和@PathVariable的用法詳解

    這篇文章主要介紹了Spring中@RequestParam、@RequestBody和@PathVariable的用法詳解,后端使用集合來接受參數(shù),靈活性較好,如果url中沒有對參數(shù)賦key值,后端在接收時,會根據(jù)參數(shù)值的類型附,賦一個初始key,需要的朋友可以參考下
    2024-01-01
  • 深入了解Java中Synchronized的各種使用方法

    深入了解Java中Synchronized的各種使用方法

    在Java當中synchronized關鍵字通常是用來標記一個方法或者代碼塊。本文將通過示例為大家詳細介紹一下Synchronized的各種使用方法,需要的可以參考一下
    2022-08-08
  • Springboot整合mybatis-plus使用pageHelper進行分頁(使用步驟)

    Springboot整合mybatis-plus使用pageHelper進行分頁(使用步驟)

    PageHelper是一個MyBatis分頁插件,可以方便地實現(xiàn)數(shù)據(jù)庫查詢結果的分頁功能,在Maven或Gradle項目中引入依賴,并在配置文件中進行配置,本文給大家介紹Springboot整合mybatis-plus使用pageHelper進行分頁,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Java并發(fā)編程示例(八):處理線程的非受檢異常

    Java并發(fā)編程示例(八):處理線程的非受檢異常

    這篇文章主要介紹了Java并發(fā)編程示例(八):處理線程的非受檢異常,Java為我們提供了一種機制,專門用于處理由Thread對象拋出的非受檢異常,以避免程序的退出,需要的朋友可以參考下
    2014-12-12

最新評論

栾城县| 新营市| 富蕴县| 高密市| 丰都县| 大余县| 通州区| 邓州市| 高邮市| 金阳县| 马鞍山市| 深州市| 沙河市| 沙洋县| 临漳县| 靖江市| 汉沽区| 芦溪县| 万山特区| 绥化市| 乐至县| 新营市| 康定县| 南靖县| 东乌珠穆沁旗| 金山区| 方城县| 长治县| 芜湖县| 石台县| 南靖县| 温泉县| 八宿县| 加查县| 潍坊市| 河间市| 余庆县| 文昌市| 肇庆市| 砀山县| 方山县|