Swagger数据类型未生成文档

dohp0rv5  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(220)

我在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.SomeResponse"更改“org.pkg.SomeRequest”,则会生成一个默认的JSON。有人能帮帮我吗?
考虑SomeRequest和SomeResponse这两个类具有相同的代码。这是我在dataType


中使用"org.pkg.SomeRequest"的图像
这是我在dataType中使用"org.pkg.SomeResponse"的图像

hts6caw3

hts6caw31#

根据Swagger核心项目上的这个GitHub问题,如果你添加注解@ApiImplicitParam应该可以解决你的问题。

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

字符串
但通常情况下,如果你只是在你的方法签名上添加类,它就会工作。

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


此外,SomeObjectDto类应该包含“get”方法,用于变量,如。

class SomeObjectDto {
    private String info;

    getInfo(){
        return info;
    }
}


将生成以下JSON。
{ info:“string”}

w41d8nur

w41d8nur2#

ApiImplicitParam可以将一个参数Map到一个正确的类型,但是该类型必须被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参数,并将其Map到您的模型。

zvms9eto

zvms9eto3#

我在ApiImplicitParam上也遇到了同样的问题,经过2个小时的应用程序重建,我发现了另一个解决方案))
这看起来不太符合逻辑,但很有效:

@ApiOperation(value = "Запрос...", response = Request.class)
    @ApiImplicitParams({
       @ApiImplicitParam(name = "request", value = "DTO Запрос...", required = true, 
    dataType = "Request", dataTypeClass = Request.class, paramType = "body")
    })
    @ApiResponses(value = {
        @ApiResponse(code = 200, message = "Успешный запрос", response = Response.class),
        @ApiResponse(code = 400, message = "Ошибка в запросе"),
        @ApiResponse(code = 500, message = "Внутренняя ошибка сервера")
    })
    public Response processRequest(@ApiParam(hidden = true)
    @RequestBody Object request) {
            return service.processRequest(request);
    }

字符串
关键是在@ApiOperation响应字段中设置请求DTO的类,同时设置@ApiResponses注解组。
看起来这有助于swagger正确地检测请求的类型。swagger也正确地显示了响应:
x1c 0d1x的数据
当然,当我发现@danidacila发布的解决方案时,我已经在我的应用程序中使用了它,因为它看起来更好,更智能,而且效果也很好。

相关问题