当前位置: 首页 > 知识库问答 >
问题:

防止 Swagger 自动添加某些模型

车靖琪
2023-03-14

我使用Spring Boot框架构建了一个REST接口。然后,我使用Swagger版本2.9.2来生成文档。从下面的照片可以看到,Swagger自动检测了很多模型。

所以,我的问题是:我怎么告诉Swagger该曝光哪些模特?

下面是我的控制器的Swagger配置和代码片段。

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("my.package"))
            .paths(PathSelectors.any())
            .build()
            .apiInfo(API_INFO)
            .useDefaultResponseMessages(false);
}

控制器:

@PostMapping(value = "/import", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<?> importData(HttpServletRequest request) {

    // processing...

    return ResponseEntity.created(uri)
        .body(new ResponseMessage(HttpStatus.CREATED, "Your data is being processed"));
}

共有3个答案

宋畅
2023-03-14

Springfox Swagger2通过GET /v2/api-docs获取UI数据,这些数据会映射到spring fox . documentation . swagger 2 . web . swagger 2 controller . GET documentation()。因此,您可以创建一个bean来代替“ServiceModelToSwagger2Mapper”:

@Primary
@Component
class CustomServiceModelToSwagger2Mapper : ServiceModelToSwagger2MapperImpl() {
    @Autowired
    private lateinit var modelMapper: ModelMapper
    @Autowired
    private lateinit var parameterMapper: ParameterMapper
    @Autowired
    private lateinit var securityMapper: SecurityMapper
    @Autowired
    private lateinit var licenseMapper: LicenseMapper
    @Autowired
    private lateinit var vendorExtensionsMapper: VendorExtensionsMapper

    override fun mapDocumentation(from: Documentation?): Swagger? {
        if (from == null) {
            return null
        }

        val swagger = Swagger()

        swagger.vendorExtensions = vendorExtensionsMapper.mapExtensions(from.vendorExtensions)
        swagger.schemes = mapSchemes(from.schemes)
        swagger.paths = mapApiListings(from.apiListings)
        swagger.host = from.host
// ➡➡➡➡➡➡➡➡➡➡➡➡➡➡➡➡ here
        swagger.definitions = this.modelsFromApiListings(from.apiListings)
        swagger.securityDefinitions = securityMapper.toSecuritySchemeDefinitions(from.resourceListing)
        val info = fromResourceListingInfo(from)
        if (info != null) {
            swagger.info = mapApiInfo(info)
        }
        swagger.basePath = from.basePath
        swagger.tags = tagSetToTagList(from.tags)
        val list2 = from.consumes
        if (list2 != null) {
            swagger.consumes = ArrayList(list2)
        } else {
            swagger.consumes = null
        }
        val list3 = from.produces
        if (list3 != null) {
            swagger.produces = ArrayList(list3)
        } else {
            swagger.produces = null
        }

        return swagger
    }

    private fun fromResourceListingInfo(documentation: Documentation?): ApiInfo? {
        if (documentation == null) {
            return null
        }
        val resourceListing = documentation.resourceListing ?: return null
        return resourceListing.info ?: return null
    }


    /**
     * @see ModelMapper
     */
    internal fun modelsFromApiListings(apiListings: Multimap<String, ApiListing>): Map<String, Model>? {
        val definitions = newTreeMap<String, springfox.documentation.schema.Model>()
        for (each in apiListings.values()) {
// ➡➡➡➡➡➡➡➡➡➡➡➡➡➡➡➡ here
            // definitions.putAll(each.models)
            definitions.putAll(each.models.filter {
                it.value.qualifiedType.startsWith("com.cpvsn")
                        && it.value.type.typeBindings.isEmpty    
            })
        }
        return modelMapper.mapModels(definitions)
    }
}
西门正平
2023-03-14

@Api、@ApiOperation、@ApiResponses、@ApiParam、@ApiIgnore、@ApiModel、@ApiModelProperty等

盛建德
2023-03-14

您可以使用:

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2).select()
            .apis(RequestHandlerSelectors.basePackage("com.package"))
            .paths(PathSelectors.regex("/api.*")).build().apiInfo(apiInfo())
            .ignoredParameterTypes(Timestamp.class);
}

这对我很有效。在ignoredParameterTypes中指定类名后,它不再出现在swagger ui中。

 类似资料:
  • 在我的spring上下文中,我创建了一个服务bean和这个服务bean的代理(显式)。两者实现相同的接口。 有什么想法吗?

  • 这似乎是一件奇怪的事情,但是在Java中有没有办法阻止子类添加新方法(包括构造函数),同时仍然允许子类重写方法? 实际情况是,我们有一个带有一些抽象方法和构造函数的

  • 问题内容: 我们有一个Android / Blackberry项目,其中有一个共同的部分。显然,该部分被编写为可同时针对Android和Blackberry目标进行编译,因此无法使用某些较新的Java功能(例如Integer.valueOf)。我想跳过一些专门针对该部分的规则。有没有办法做到这一点? 问题答案: 如果将通用零件分离到自己的项目,则可以在Sonar中添加新的质量配置文件(在其中停用了

  • 问题内容: 我有几个使用共享资源(数据库)的作业,有时这会在(碰巧)同时触发作业的(罕见)事件中导致构建失败。 例如,给定作业A到E,是否有任何方法可以指定A和C 绝不能同时运行 ? 除上述资源外,构建彼此独立(例如,不存在上游/下游关系)。 “强力”方式将执行者的数量限制为一个,但是如果大多数作业可以很好地同时执行并且在构建服务器上不缺少计算资源,那么显然这不是理想的选择。 问题答案: 当前有两

  • 问题内容: 我想创建一个触发器,以防止在出生日期(列之一)将来的时候插入。我有这个: 如何取消if语句中的插入? 问题答案: 基于这一点,我不确定是否可以这样做。 MySQL当前的触发器实现中不支持自愿引发异常并中止生成触发器的语句。 我发现的解决方法是编写一个BEFORE触发器,以将表中的not-NULL列之一设置为NULL,从而违反了其NOT NULL约束。这导致产生触发器的语句被中止。

  • 我正在用Python编写一个带有Tkinter UI的程序。我想有一个没有标题栏的小窗口。此窗口必须接收键盘输入。我并不挑剔这是一个条目小部件的形式,还是仅仅绑定到KeyPress。 通常是禁用标题栏的方式。不幸的是,(除了在Windows中,这似乎阻止了许多事件被接收。我写了这段代码来说明问题: 这将创建一个小窗口(没有标题栏),当它接收到公共事件时,该窗口将打印这些事件的名称。我已经在Wind