Tengo el siguiente código en 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();
}

Se supone que el código generará automáticamente una solicitud json predeterminada dependiendo del tipo de datos que en este caso es "org.pkg.SomeRequest" pero no se genera nada. Por el contrario, si cambio el "org.pkg.SomeRequest" con "org.pkg.SomeResponse", se genera un JSON predeterminado para esto. puede alguien ayudarme por favor?

Considere que ambas clases SomeRequest, SomeResponse tienen el mismo código. Esta es la imagen donde utilizo "org.pkg.SomeRequest" en el tipo de datos Esta es la imagen donde uso <code> "org.pkg.SomeRequest"  </code> en el tipo de datos Esta es la imagen donde utilizo <code> "org.pkg.SomeResponse"  </code> en el tipo de datos

Esta es la imagen donde uso "org.pkg.SomeResponse" en el tipo de datos

1
utkarsh31 27 jun. 2017 a las 19:10

2 respuestas

La mejor respuesta

De acuerdo con este GitHub problema en el proyecto principal de Swagger, si agrega la anotación @ApiImplicitParam debería resolver su problema.

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

Pero normalmente si solo agrega la clase en la firma de su método, funcionará.

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

También la clase SomeObjectDto debe contener métodos "get" para sus variables como.

class SomeObjectDto {
    private String info;

    getInfo(){
        return info;
    }
}

Producirá el siguiente JSon.

{info: "cadena"}

2
Vinicius de Almeida 28 jun. 2017 a las 11:13

ApiImplicitParam puede asignar un parámetro a un tipo correcto, pero el tipo debe ser detectado por swagger, por lo que debe ser una referencia válida. La única forma en que podría hacer que esto funcione es mediante el método additionalModels.

Ejemplo en spring-boot:
configurar arrogancia

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());
}

Controlador

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

Por supuesto, podría tener un parámetro InputStream para la solicitud y asignarlo a su modelo.

0
Suraj Rao 27 ago. 2019 a las 15:39