无Spring Boot的纯Spring MVC如何全局自定义Jackson JSON序列化配置
纯Spring MVC 5.x 全局配置Jackson字段序列化可见性方案
核心逻辑是直接修改Spring MVC内置MappingJackson2HttpMessageConverter持有的ObjectMapper实例的全局可见性规则,对齐Gson默认序列化非私有字段的行为,无需修改任何现有模型类代码。
方案1:Java Config 配置(推荐)
在你的Spring MVC配置类(带@EnableWebMvc的配置类)中重写extendMessageConverters方法,直接修改已注册的Jackson消息转换器的ObjectMapper配置:
@Configuration @EnableWebMvc public class MvcConfig implements WebMvcConfigurer { @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { for (HttpMessageConverter<?> converter : converters) { if (converter instanceof MappingJackson2HttpMessageConverter jacksonConverter) { ObjectMapper mapper = jacksonConverter.getObjectMapper(); // 全局配置:所有非私有字段直接参与序列化/反序列化 mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NON_PRIVATE); // 可选配置:关闭getter方法序列化检测,避免出现同名字段重复序列化的问题 mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); mapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE); break; } } } }
注意:不要用
configureMessageConverters方法做配置,该方法会替换Spring MVC默认加载的全部消息转换器,可能导致其他类型的请求/响应解析异常。extendMessageConverters是在默认注册的转换器基础上做修改,不会影响原有转换器的正常加载。
方案2:XML 配置
如果你的项目使用XML形式配置Spring MVC,直接在<mvc:annotation-driven>标签内注册自定义配置的Jackson消息转换器即可:
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="visibility" value="#{T(com.fasterxml.jackson.databind.introspect.VisibilityChecker.Std).default .withFieldVisibility(T(com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility).NON_PRIVATE) .withGetterVisibility(T(com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility).NONE) .withIsGetterVisibility(T(com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility).NONE)}"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
注意:必须设置
register-defaults="true",否则会导致其他默认消息转换器(比如字符串解析、表单解析转换器)失效。
常见配置失效原因
- 自己单独new了
ObjectMapper实例做配置,但没有把配置后的实例设置到Spring MVC管理的MappingJackson2HttpMessageConverter中,Spring MVC不会读取你自定义的独立ObjectMapper配置 - 配置类没有被Spring上下文扫描到,或者
@EnableWebMvc注解缺失,导致自定义的MVC配置没有生效 - 错误使用
configureMessageConverters方法导致原有Jackson转换器被覆盖,新的转换器配置不正确
配置完成后重启服务,示例中的Coffee类的name、brand两个默认访问权限的字段就可以正常序列化返回了,和之前Gson的行为完全一致。
内容的提问来源于stack exchange,提问作者Jakub Królikowski
相关产品推荐
相关产品推荐

