项目场景:
用SSE给前端发送中文字符串乱码(用SseEmitter也是一样的问题):
java
@RestController
@RequiredArgsConstructor
@RequestMapping("/agentic")
public class AgenticController {
private final ChatAgent chatAgent;
@PostMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chat(@RequestParam String message) {
return chatAgent.model(ModelEnum.DEEPSEEK)
.prompt()
.user(message)
.stream()
.content();
}
}
- SpringBoot:3.2.5
- SpringMVC
原因分析:
返回的时候字符串转换StringHttpMessageConverter默认编码不是UTF-8。
解决方案:
java
@Configuration
public class AgenticConfig extends WebMvcConfigurationSupport {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (int i = 0; i < converters.size(); i++) {
HttpMessageConverter<?> converter = converters.get(i);
if (converter instanceof StringHttpMessageConverter) {
// 替换成 UTF-8 编码
converters.set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8));
}
}
}
}
追问
- 加上这个配置前端可以了,但是使用.http文件请求还是乱码,不知道为什么:
java
POST http://localhost:8085/aigc/agentic/chat?message=%E4%BB%8A%E5%A4%A9%E6%98%AF%E5%87%A0%E6%9C%88%E5%87%A0%E5%8F%B7
HTTP/1.1 200
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Allow-Headers: x-requested-with
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 3600
Content-Type: text/event-stream
Transfer-Encoding: chunked
Date: Wed, 03 Dec 2025 07:07:38 GMT
Response code: 200; Time: 1051ms (1 s 51 ms)
data:ä>>Šå¤©æ˜¯
data: **
data:202
data:5
data:
data:å¹´
data:
- 改什么配置都不好使,把结果转成ISO编码也不好使,Spring难用到这种程度了吗
- 继承WebMvcConfigurer修改配置也不好使(必须得加@EnableWebMvc)