如何在 Swagger 中记录无法访问的控制器的其他模型?

2022-09-04 21:50:53

我有一个控制器,我必须通过让它接受一个as并返回一个字符串来保持通用,即,String@RequestBodyString processRequest(@RequestBody String json) {...}

我无法控制该控制器的源代码,但我可以通过编程方式访问它。

将要传入和返回的实际对象在一系列请求消息中的其他位置定义:、、等。响应同样为:、 .RequestMessage1.javaRequestMessage2.javaResponse1.javaResponse2.java1

控制器还将这些请求的处理移交给一个,如下所示 (): 。ProcessorRequest1Processor.javaResponse1 process(RequestMessage1 message)

我的问题是这样的。

有没有办法配置 swagger,使其公开 REST 控制器类的终结点,即 ,但显示所有这些处理器类及其输入和输出作为该控制器的文档?processRequest

作为文档的一部分,我看到了添加无法“访问”的模型的能力。我尝试了文档中的方法,如下所示:

@Autowired
private TypeResolver typeResolver;

@Bean
public Docket api() {
  return new Docket(DocumentationType.SWAGGER_2)
      .select()
      .apis(RequestHandlerSelectors.any())
      .paths(PathSelectors.any())
      .build()
      .additionalModels(typeResolver.resolve(Date.class));
}

但是,附加的 Date 模型没有出现在 swagger-ui 中.html。

我在这里做错了什么?

另外,有没有办法以某种方式显示该类型将具有响应?RequestMessage1Response1


答案 1

Dateclass 是一个不利的测试示例,因为它被视为字符串

数据类型

...

  • 字符串(包括日期和文件)

使用要另外记录的真实模型再次尝试:

@Bean
public Docket api(TypeResolver typeResolver) {
    return new Docket(DocumentationType.SWAGGER_2)
          .select()
          .apis(RequestHandlerSelectors.any())
          .paths(PathSelectors.any())
          .build()
          .additionalModels(typeResolver.resolve(RequestMessage1.class, Response1.class)));
}

答案 2

另一种解决方案是扩展已存在的案卷对象,而不是创建一个新对象。

下面是一个解决方案:


import com.fasterxml.classmate.TypeResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class SwaggerConfiguration {

    private final TypeResolver typeResolver;

    @Autowired
    public SwaggerConfiguration(TypeResolver typeResolver) {
        this.typeResolver = typeResolver;
    }

    @Autowireda
    public void createAdditionalModelDocumentation(Docket docket) {
        docket.additionalModels(typeResolver.resolve(RequestMessage1.class),
                                typeResolver.resolve(Response1.class));
    }

}

推荐