You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:24:19