You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

控制器响应存在非断空格双重转义问题,求解决方案

Kotlin Spring控制器中非断空格双重转义问题解决方案

问题描述

Kotlin Spring控制器返回包含非断空格的实体时出现双重转义:控制台打印的实体中,非断空格显示为\I00A0,但接口响应(Insomnia中查看)里该内容变成了\\I00A0,即被额外转义了一次。

解决方案

方案1:调整Jackson序列化配置,禁用非ASCII字符转义

Spring默认使用Jackson作为JSON序列化器,默认会对非ASCII字符进行转义,导致原本的转义字符被二次转义。可以通过配置禁用该行为:

创建Jackson配置类:

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class JacksonConfig {
    @Bean
    fun objectMapper(): ObjectMapper {
        return ObjectMapper()
            .registerKotlinModule()
            // 禁用非ASCII字符的自动转义,让非断空格以原始Unicode字符输出
            .disable(SerializationFeature.ESCAPE_NON_ASCII)
    }
}

方案2:反转义实体中的转义字符串

如果实体存储的是转义后的字符串(比如\u00A0而非实际的非断空格字符),可以在返回前手动反转义:

修改控制器方法:

@RestController
@RequestMapping("/abc/")
class Controller(
    private val service: Service
) {

    @GetMapping("/byId/{id}", produces = [MediaType.APPLICATION_JSON_VALUE])
    suspend fun getEntity(
        @PathVariable id: Long,
    ) : EntityResponse {
        val entity = service.getEntity(id)
        // 将转义字符串替换为实际的非断空格字符
        val fixedTestContent = entity.test.replace("\\u00A0", "\u00A0")
        println(entity)
        return entity.copy(test = fixedTestContent)
    }
}

方案3:检查实体类的序列化注解

检查EntityResponse类的test字段是否带有@JsonRawValue等可能引发额外转义的注解,这类注解会改变Jackson的序列化逻辑,导致双重转义。若存在此类注解,可直接移除或调整为符合需求的配置。

验证

修改完成后重启服务,调用接口查看Insomnia中的响应,test字段的非断空格应显示为单次转义(\u00A0)或直接显示非断空格字符,不再出现双重转义的\\u00A0。

内容的提问来源于stack exchange,提问作者user494885

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:52:44