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,其他场景仍要正常返回:- 给
getSex()方法标注不属于当前使用的视图类:// 定义一个不会被业务序列化使用的空视图接口 public interface IgnoreView {} // 给getSex方法标注该视图 @JsonView(IgnoreView.class) public String getSex() { return sex; } - 也可以直接给
getSex()方法标注空视图数组,该方法不会匹配任何视图,使用JsonView序列化时就会被忽略:@JsonView({}) public String getSex() { return sex; }
- 给
内容的提问来源于stack exchange,提问作者bashar
相关产品推荐
相关产品推荐

