Spring同一Java模型类不同接口返回时排除指定字段方案
接口同实体差异化返回字段实现方案
两种稳定可落地的实现方式,按需选择即可。
方案1:正确配置@JsonView(无侵入,适合多场景复用)
之前@JsonView不生效,90%的情况是漏了Controller方法上的视图声明、或者没关闭Jackson默认视图全量包含的配置,按以下步骤配置即可正常生效:
- 第一步:定义视图标识接口
public class CarViews { // 小列表视图:仅返回指定字段 public interface SmallList {} // 大列表视图:返回全部字段,继承SmallList后,小列表可见的字段大列表也可见 public interface BigList extends SmallList {} }
- 第二步:给
Cars实体类的字段绑定对应视图,假设小列表需要返回id、brand、country3个字段:
@Table(name = "CAR_TABLE") public class Cars { @Id @Column(name = "ID") @JsonView(CarViews.SmallList.class) private Long id; @Column(name = "BRAND", nullable = false) @JsonView(CarViews.SmallList.class) private String brand; @Column(name = "COUNTRY", nullable = false) @JsonView(CarViews.SmallList.class) private String country; @Column(name = "CLIENT", nullable = false) @JsonView(CarViews.BigList.class) private String client; @Column(name = "TRANSMISSION", nullable = false) @JsonView(CarViews.BigList.class) private String transmission; // 省略getter、setter方法 }
- 第三步:在Controller的接口方法上声明对应使用的视图
@PostMapping("/searchCarBigList") @JsonView(CarViews.BigList.class) public ResponseEntity<Cars> searchBigList( @Parameter(description = "搜索请求参数DTO") @RequestBody SearchRequest searchRequest) { return ResponseEntity.ok(someService.search(searchRequest)); } @PostMapping("/searchCarSmallList") @JsonView(CarViews.SmallList.class) public ResponseEntity<Cars> searchSmallList( @Parameter(description = "搜索请求参数DTO") @RequestBody SearchRequest searchRequest) { return ResponseEntity.ok(someService.search(searchRequest)); }
- 第四步:补充必加配置,避免未标注视图的字段被默认返回
在application.yml中添加Jackson配置:
spring: jackson: mapper: DEFAULT_VIEW_INCLUSION: false
方案2:接口级字段过滤(零实体修改,适合简单场景)
如果不想改动原有Cars实体类,也不想额外定义视图类,可以直接在小列表接口上用@JsonIncludeProperties注解指定要返回的字段,大列表接口不加任何注解默认返回全量字段即可,配置完直接生效:
@PostMapping("/searchCarSmallList") // 数组内填写需要返回的、和Cars类属性名一致的字段名即可 @JsonIncludeProperties({"id", "brand", "country"}) public ResponseEntity<Cars> searchSmallList( @Parameter(description = "搜索请求参数DTO") @RequestBody SearchRequest searchRequest) { return ResponseEntity.ok(someService.search(searchRequest)); }
内容的提问来源于stack exchange,提问作者mesut
相关产品推荐
相关产品推荐

