创建Java对象后移除指定成员变量的可行性咨询
问题:如何移除Java对象中已设置的字段(避免JSON返回该字段)
我定义了如下Java类:
@Getter @Setter @ToString @NoArgsConstructor(access = AccessLevel.PUBLIC) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder public class Quote { private Premium totalAmount; private String productCode; private String status; }
用Builder构建对象时,如果没设置status,对象里该字段默认是null;但如果先设置了status再调用setStatus(null),只是把值置空,JSON序列化时还是会输出"status": null。我需要彻底让这个字段从对象的JSON响应中“消失”——status仅用于内部判断支付类型,不需要暴露给用户。
解决方案
方法1:通过JSON序列化框架控制(最常用)
如果用Jackson作为JSON序列化工具,可以通过配置让null值字段不输出到JSON中,分两种场景:
1.1 全局配置(所有null字段都不输出)
在Spring Boot项目中,直接在配置文件添加:
spring.jackson.default-property-inclusion=non_null
或者在代码中手动配置ObjectMapper:
ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
这样不管是一开始没设置status,还是后来把它设为null,JSON里都不会出现这个字段。
1.2 针对单个字段配置
如果只想让status字段在为null时不输出,给字段加注解即可:
@Getter @Setter @ToString @NoArgsConstructor(access = AccessLevel.PUBLIC) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder public class Quote { private Premium totalAmount; private String productCode; @JsonInclude(JsonInclude.Include.NON_NULL) private String status; }
方法2:自定义Builder的重置方法
基于Lombok的@Builder扩展一个重置status的方法,把字段变回null状态:
@Getter @Setter @ToString @NoArgsConstructor(access = AccessLevel.PUBLIC) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder public class Quote { private Premium totalAmount; private String productCode; private String status; // 自定义Builder方法,重置status public static class QuoteBuilder { public QuoteBuilder resetStatus() { this.status = null; return this; } } }
使用时直接调用重置方法:
Quote quote = Quote.builder() .totalAmount(new Premium("123.45")) .productCode("AC") .status("Full") .resetStatus() .build();
再配合方法1的JSON配置,就能让status字段从响应中消失。
方法3:拆分类(最彻底的隔离方式)
把内部使用和对外返回的类拆分,从根源上避免字段暴露:
// 内部业务用类,包含status @Getter @Setter @Builder public class InternalQuote { private Premium totalAmount; private String productCode; private String status; } // 对外返回用类,不含status @Getter @Setter @Builder public class PublicQuote { private Premium totalAmount; private String productCode; }
业务处理时用InternalQuote,返回给用户前转成PublicQuote:
// 内部业务逻辑 InternalQuote internalQuote = InternalQuote.builder() .totalAmount(new Premium("123.45")) .productCode("AC") .status("Full") .build(); // 转换为对外返回的对象 PublicQuote publicQuote = PublicQuote.builder() .totalAmount(internalQuote.getTotalAmount()) .productCode(internalQuote.getProductCode()) .build();
这样返回的JSON自然不会包含status字段。
内容的提问来源于stack exchange,提问作者runnerpaul
相关产品推荐
相关产品推荐

