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

使用@JsonView时如何无需额外标注就排除schema中的非指定属性

问题描述

在Spring中,当控制器方法标注了@JsonView注解时,默认遵循spring.jackson.mapper.default-view-inclusion值为false的配置,仅返回对象中对应标注的属性。

示例代码如下:

// Kotlin code

abstract class Base {
    lateinit var transientInternalProperty: String
}

class Main(val externalProperty: String) : Base()

@RestController
@RequestMapping("/")
class MainController {

    @JsonView(Views.Public::class)
    @GetMapping("/")
    fun index() = Main()
}

以上述代码为例,如何在生成的Main_Public schema中排除未标注@JsonView的属性?如何无需额外给transientInternalProperty添加注解,就能将其从Main_Public中剔除?


解决方案

方案1:全局配置对齐Jackson行为(推荐)

不需要给任何属性加额外注解,只需要在application配置文件中新增springdoc的专属配置即可:

springdoc:
  default-view-inclusion: false

该配置开启后,springdoc生成带@JsonView的schema时,会自动排除所有未显式标注当前视图的属性,父类继承的transientInternalProperty会直接从Main_Public schema中被过滤,和接口实际返回的字段完全一致。

注意:springdoc的该配置独立于Spring Jackson的同名配置,默认值为true,这也是为什么你已经配置了Jackson的default-view-inclusion=false,但文档schema还是会展示未加@JsonView属性的原因。

方案2:自定义过滤规则(适合复杂场景)

如果你需要按属性名前缀、所属类等更灵活的条件过滤,可以自定义ModelCustomizer实现全局过滤,示例如下:

import org.springdoc.core.customizers.ModelCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class SpringDocCustomConfig {
    @Bean
    fun jsonViewFilterModelCustomizer(): ModelCustomizer {
        return ModelCustomizer { model, modelContext ->
            // 只处理带Public视图后缀的schema
            if (modelContext.parameter?.schema?.name?.endsWith("_Public") == true) {
                // 过滤掉所有transient开头的内部属性
                model.properties = model.properties.filterKeys { 
                    !it.startsWith("transient") 
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:24:00