使用@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
相关产品推荐
相关产品推荐

