控制器响应存在非断空格双重转义问题,求解决方案
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
相关产品推荐
相关产品推荐

