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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:24:24