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

Jackson @JsonView不生效:如何在保留getter前提下隐藏未加注解的属性

问题根因

Jackson 默认开启了MapperFeature.DEFAULT_VIEW_INCLUSION配置,含义是:没有标注任何@JsonView注解的属性/公共Getter方法,会被自动包含到所有视图的序列化结果中。你的sex字段没有加@JsonView注解,但存在公共Getter方法,所以就被默认序列化返回了。

你删除Getter后字段不返回,是因为sex字段是包访问权限,Jackson默认无法直接访问非公开字段,自然无法序列化该字段。


解决方案

方案1:全局关闭默认视图包含(推荐)

该方案会让所有@JsonView注解严格生效,只有标注了当前视图注解的属性才会被序列化,完全符合你的预期。
如果是Spring Boot项目,直接在配置文件中添加配置:

spring:
  jackson:
    mapper:
      default-view-inclusion: false

如果是普通Spring MVC项目,通过自定义ObjectMapper关闭配置:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 关闭默认视图包含,仅序列化标注了当前视图的属性
        mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
        return mapper;
    }
}

方案2:局部控制sex字段序列化(无需改全局配置)

如果你只需要处理这一个字段,不想影响其他业务的JsonView逻辑,可以按需选择以下任意一种方式:

  • 若sex字段在所有场景下都不需要序列化,直接在字段或Getter上加@JsonIgnore注解即可,该注解优先级高于JsonView配置。
  • 若仅在使用CustomCategoryExternalView视图时不返回sex,其他场景仍要正常返回:
    1. 给getSex()方法标注不属于当前使用的视图类:
      // 定义一个不会被业务序列化使用的空视图接口
      public interface IgnoreView {}
      
      // 给getSex方法标注该视图
      @JsonView(IgnoreView.class)
      public String getSex() {
          return sex;
      }
      
    2. 也可以直接给getSex()方法标注空视图数组,该方法不会匹配任何视图,使用JsonView序列化时就会被忽略:
      @JsonView({})
      public String getSex() {
          return sex;
      }
      

内容的提问来源于stack exchange,提问作者bashar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:54:08