Swagger 数据类型不生成文档

Swagger datatype not generating docs

我在 Swagger 中有以下代码,

@Path("/v1")
    @ApiOperation(value = "POST - Some Value", nickname = "post-funtion", consumes = "application/json", produces = "text/html; charset=UTF-8", tags = {
            "Some Controller" })
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", paramType = "header", dataType = "string", format = "JWT", required = false, value = "A User Service JWT"),
            @ApiImplicitParam(name = "Request", value = "Request Object", paramType = "body", dataType = "org.pkg.SomeRequest", required = true) })
    @ApiResponses({
            @ApiResponse(code = 200, message = "Value Added", response = SomeResponse.class) })
private Object retrieveByName(Request request, Response response)
{
    return new RetrieveByNameRqstHandler(catalogService, request, response).handle();
}

代码应该根据数据类型自动生成默认 json 请求,在本例中为 "org.pkg.SomeRequest" 但没有生成任何内容。相反,如果我将 "org.pkg.SomeRequest" 更改为 "org.pkg.SomeResponse",则会为此生成默认的 JSON。有人可以帮我吗?

考虑 类 SomeRequest、SomeResponse 具有相同的代码。 这是我在数据类型中使用 "org.pkg.SomeRequest" 的图像

这是我在 dataType

中使用 "org.pkg.SomeResponse" 的图像

根据关于 Swagger 核心项目的 GitHub issue,如果您添加注释 @ApiImplicitParam 应该可以解决您的问题。

@ApiImplicitParams({
    @ApiImplicitParam(
        required = true,
        dataType = "com.example.SomeObjectDto",
        paramType = "body"
    )
})

但通常情况下,如果您只需在方法签名上添加 class,它就会起作用。

private Object retrieveByName(SomeObjectDto someObjectDto) {
    someCode();
}

SomeObjectDto class 还应该包含 "get" 变量的方法,例如。

class SomeObjectDto {
    private String info;

    getInfo(){
        return info;
    }
}

将产生以下 JSon.

{ info: "string" }

ApiImplicitParam 可以将参数映射到正确的类型,但类型必须由 swagger 检测,因此必须是有效的引用。 我能让这个工作的唯一方法是使用 additionalModels 方法。

spring-boot 中的示例:
配置 swagger

import springfox.documentation.spring.web.plugins.Docket;
import com.fasterxml.classmate.TypeResolver;
...

@Bean
public Docket api(TypeResolver typeResolver) {
  return new Docket(DocumentationType.SWAGGER_2)
    .groupName("your-group-rest-api")
    .select()
    .apis(RequestHandlerSelectors.basePackage("your.package"))
    .paths(PathSelectors.any())
    .build()
    .additionalModels(typeResolver.resolve(YourModel.class))
    .apiInfo(apiInfo());
}

控制器

@ApiOperation...
@ApiImplicitParams(
  @ApiImplicitParam(dataType = "YourModel", name = "requestJson", paramType = "body"))
@ApiResponses...
@RequestMapping...
public void yourMethod(@RequestBody String requestJson,...)

当然,您可以为请求设置一个 InputStream 参数并将其映射到您的模型。