現象:配置了 StringHttpMessageConverter 仍亂碼,Response Header 仍是 text/plain;charset=ISO-8859-1。
<mvc:annotation-driven> 會註冊默認轉換器,**順序優先於自定義 converter**。若不關閉默認註冊,自定義的 UTF-8 轉換器不生效。
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<!-- 1. String 轉換器:指定 UTF-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 2. JSON 轉換器:Jackson 2.x -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list><value>application/json;charset=UTF-8</value></list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
@RestController // 等同 @Controller + @ResponseBody
@RequestMapping(value = "/api", produces = "application/json;charset=UTF-8")
public class MyController {
@GetMapping("/data")
public Result getData() {
return Result.ok("中文內容"); // 直接返回對象,Jackson 自動序列化
}
}
register-defaults="false" 禁用 Spring 默認轉換器(含 ISO-8859-1 StringConverter)。StringHttpMessageConverter 並綁定 charset=UTF-8。MappingJackson2HttpMessageConverter,1.x 用 MappingJacksonHttpMessageConverter。produces = "application/json;charset=UTF-8",雙重保險。project.build.sourceEncoding)。curl -v https://localhost:8080/api/data
# 檢查 Response Headers:
# Content-Type: application/json;charset=UTF-8
# 體裡中文正常顯示
徹底解決亂碼核心:**掌握轉換器註冊順序與優先級,禁用默認、顯式指定 UTF-8,Controller 加 produces**。