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

如何结合@JsonView实现Swagger接口文档属性的条件隐藏?

实现方案

完全可以通过@JsonView实现Swagger文档按需展示不同接口的响应属性,Springfox(Swagger Spring集成框架)2.6.0+版本、SpringDoc(OpenAPI 3官方推荐实现)都原生支持该能力,无需自定义扩展插件,操作步骤如下:

步骤1:定义视图区分接口场景

先定义标记用的视图接口,用于区分不同接口的属性可见范围:

public class View {
    // 接口A专属视图
    public interface ApiA {}
    // 接口B专属视图
    public interface ApiB {}
}

如果需要实现属性继承(比如接口B要包含接口A的所有可见属性),可以让视图接口继承:

public interface ApiB extends ApiA {}

步骤2:给实体类属性绑定视图

给响应实体的属性标注@JsonView,指定该属性可以在哪些视图下展示:

public class CommonResponse {
    // 两个接口都展示的属性,绑定两个视图
    @JsonView({View.ApiA.class, View.ApiB.class})
    @ApiModelProperty("通用主键ID")
    private Long id;

    // 仅在接口A展示的属性
    @JsonView(View.ApiA.class)
    @ApiModelProperty("仅接口A返回的敏感字段")
    private String sensitiveFieldForA;

    // 仅在接口B展示的属性
    @JsonView(View.ApiB.class)
    @ApiModelProperty("仅接口B返回的扩展字段")
    private String extFieldForB;
}

步骤3:给接口方法绑定对应视图

在Controller的接口方法上标注@JsonView,指定该接口使用的视图,Swagger会自动过滤模型属性:

@RestController
@RequestMapping("/api")
public class DemoController {
    // 接口A的文档只会展示绑定了ApiA视图的属性
    @GetMapping("/a")
    @JsonView(View.ApiA.class)
    public CommonResponse getApiAData() {
        // 业务逻辑
        return new CommonResponse();
    }

    // 接口B的文档只会展示绑定了ApiB视图的属性
    @GetMapping("/b")
    @JsonView(View.ApiB.class)
    public CommonResponse getApiBData() {
        // 业务逻辑
        return new CommonResponse();
    }
}

注意事项

  • 不要给属性加@ApiModelProperty(hidden = true),否则该属性会在所有接口的文档中全局隐藏,和视图配置无关
  • 没有标注任何@JsonView的属性默认会在所有视图下展示,需要全局隐藏的属性才可以加hidden = true
  • Springfox 3.x+默认开启JsonView支持,如果是低版本可以在配置文件中手动开启:
springfox:
  documentation:
    json-view-enabled: true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:18:02