Search code examples
javaswaggermicroservicesspark-java

Swagger datatype not generating docs


I have the below code in 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();
}

The code is supposed to automatically generate default json request depending upon the datatype which in this case is "org.pkg.SomeRequest" but there is nothing generated. On the contrary if I change the "org.pkg.SomeRequest" with "org.pkg.SomeResponse" there is a default JSON generated for this. Can anybody help me please?

Consider both classes SomeRequest,SomeResponse have the same code. This is the image where I use "org.pkg.SomeRequest" in the dataType This is the image where I use <code>"org.pkg.SomeRequest"</code> in the dataType This is the image where I use <code>"org.pkg.SomeResponse"</code> in the dataType

This is the image where I use "org.pkg.SomeResponse" in the dataType


Solution

  • According to this GitHub issue on Swagger core project, if you add the annotation @ApiImplicitParam should resolve your problem.

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

    But normally if you just add the class on your method signature it'll work.

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

    Also SomeObjectDto class should contain "get" methods for your variables like.

    class SomeObjectDto {
        private String info;
    
        getInfo(){
            return info;
        }
    }
    

    Will produce the following JSon.

    { info: "string" }