spring mvc中自定义json响应需通过配置messageconverter或responsebodyadvice:用extendmessageconverters定制jackson(如忽略null、统一日期格式);用configuremessageconverters注册gson;用responsebodyadvice实现统一封装(如result.success)。

Spring MVC 中使用 @ResponseBody 返回 JSON,默认依赖 Jackson(jackson-databind)自动配置的 MappingJackson2HttpMessageConverter。若需自定义消息转换器(比如统一包装响应结构、替换 Jackson 为 Gson、或调整日期格式/空值处理等),可通过配置方式替换或扩展默认转换器。
注册自定义的 Jackson 消息转换器
最常见需求是定制 Jackson 的行为,例如全局忽略 null 字段、统一时间格式、添加序列化器等。可在配置类中重写 configureMessageConverters 或 extendMessageConverters 方法:
- 用
configureMessageConverters完全替换默认转换器(慎用,会丢弃 Spring Boot 自动配置的其他 converter) - 推荐用
extendMessageConverters:在已有 converter 列表中修改 Jackson 实例
示例(Spring Boot 2.x/3.x):
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<httpmessageconverter>> converters) {
// 找到 Jackson 转换器并重新配置 ObjectMapper
converters.stream()
.filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
.findFirst()
.ifPresent(converter -> {
MappingJackson2HttpMessageConverter jacksonConverter =
(MappingJackson2HttpMessageConverter) converter;
ObjectMapper objectMapper = jacksonConverter.getObjectMapper();
// 全局忽略 null 值字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 统一日期格式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.registerModule(new JavaTimeModule());
});
}
}</httpmessageconverter>
使用 Gson 替换 Jackson
若项目已用 Gson,或需更轻量级 JSON 库,可引入 gson 依赖,并注册 GsonHttpMessageConverter:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- Maven 添加依赖:
com.google.code.gson:gson - 配置类中注册(注意顺序:Gson 转换器需放在 Jackson 之前,避免被覆盖)
示例:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<httpmessageconverter>> converters) {
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.excludeFieldsWithoutExposeAnnotation()
.create();
converters.add(0, new GsonHttpMessageConverter(gson));
}
}</httpmessageconverter>
自定义全局响应包装(如统一返回格式)
业务中常需所有接口返回类似 {"code":200,"msg":"success","data":{...}} 结构。不建议在每个 Controller 方法里手动封装,而应通过 ResponseBodyAdvice 实现自动包装:
- 实现
ResponseBodyAdvice接口,泛型指定要拦截的返回类型(如Object) - 重写
supports控制生效范围(如排除@ResponseBody+@Controller类) - 重写
beforeBodyWrite修改返回体
示例:
@RestControllerAdvice
public class ResponseWrapper implements ResponseBodyAdvice<object> {
@Override
public boolean supports(MethodParameter returnType, Class extends HttpMessageConverter>> converterType) {
return true; // 对所有 @ResponseBody 生效
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType,
MediaType selectedContentType,
Class extends HttpMessageConverter>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof Result) { // 已是包装类,不重复包装
return body;
}
return Result.success(body); // 自定义 Result.success() 返回统一封装对象
}
}</object>
注意事项与调试技巧
自定义消息转换器后,若 JSON 返回异常(如 406 Not Acceptable 或空白响应),可检查:
- 确认 controller 方法有
@ResponseBody或类上有@RestController - 确保返回对象字段是 public 或有 getter 方法(Jackson 默认只序列化 public 字段或 getter)
- 查看日志是否报
No converter for class XXX—— 说明没有匹配的 converter,可能因类型未被支持或 converter 未注册成功 - 用
@PostMapping(produces = "application/json")显式声明 media type,帮助 Spring 匹配 converter
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










