0
votes

I am working on trying to correctly document our rest endpoints. As an example to get this working I created a sample "Healthcheck getStatus()" endpoint which is returning an object called "EndpointStatus" which has 3 fields (class is below). I was able to get this object documenting correctly and using the camel-swagger-java component and the below rest configuration / definition;

 restConfiguration()
                .apiContextPath(apiContextPath)
                .apiProperty("api.title", "Camel Service").apiProperty("api.version", "1.0.0")
                // and enable CORS
                .apiProperty("cors", "true");

 rest()
            .path("/healthcheck")
                .description("Health Check REST service")

                .get("getStatus/{endpointName}")
                    .param()
                        .name("endpointName")
                        .type(RestParamType.path)
                        .allowableValues(
                                Stream.of(EndpointName.values())
                                .map(EndpointName::name)
                                .collect(Collectors.toList()))
                        .required(true)
                        .endParam()
                    .description("Get Camel Status")
                    .id("getStatus")
                    .outType(EndpointStatus.class)
                    .bindingMode(RestBindingMode.auto)
                    .responseMessage().code(200).message("Returns an EndpointStatus object representing state of a camel endpoint").endResponseMessage()
                    .to(CAMEL_STATUS_URI);

Here are the annotations I used on this class:

@ApiModel(description = "Endpoint Status Model")
public class EndpointStatus {

    private boolean isAvailable;
    private EndpointName name;
    private long timestamp;

    @ApiModelProperty(value = "Is the endpoint available", required = true)
    public boolean isAvailable() {
        return isAvailable;
    }

    public void setAvailable(boolean available) {
        isAvailable = available;
    }

    @ApiModelProperty(value = "The name of the endpoint", required = true)
    public EndpointName getName() {
        return name;
    }

    public void setName(EndpointName name) {
        this.name = name;
    }

    @ApiModelProperty(value = "The timestamp the endpoint was checked", required = true)
    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }
}

Along with the generated swagger documentation:

{
  "swagger": "2.0",
  "info": {
    "version": "1.0.0",
    "title": "Camel Service"
  },
  "host": "localhost:9000",
  "tags": [
    {
      "name": "healthcheck",
      "description": "Health Check REST service"
    }
  ],
  "schemes": [
    "http"
  ],
  "paths": {
    "/healthcheck/getStatus/{endpointName}": {
      "get": {
        "tags": [
          "healthcheck"
        ],
        "summary": "Get Camel Status",
        "operationId": "getStatus",
        "parameters": [
          {
            "name": "endpointName",
            "in": "path",
            "required": true,
            "type": "string",
            "enum": [
              "ENDPOINTA",
              "ENDPOINTB"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Returns an EndpointStatus object representing state of a camel endpoint",
            "schema": {
              "$ref": "#/definitions/EndpointStatus"
            }
          }
        }
      }
    }
  },
  "definitions": {
    "EndpointStatus": {
      "type": "object",
      "required": [
        "available",
        "name",
        "timestamp"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the endpoint",
          "enum": [
            "ENDPOINTA",
            "ENDPOINTB"
          ]
        },
        "timestamp": {
          "type": "integer",
          "format": "int64",
          "description": "The timestamp the endpoint was checked"
        },
        "available": {
          "type": "boolean",
          "description": "Is the endpoint available"
        }
      },
      "description": "Endpoint Status Model"
    }
  }
}

However, when trying to move to use camel-openapi-java which supports OpenAPI Specification v3 with the same setup I am getting EndpointStatus without any fields / descriptions in my documentation.

{
  "openapi": "3.0.2",
  "info": {
    "title": "SurePath Camel Service",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": ""
    }
  ],
  "paths": {
    "/healthcheck/getStatus/{endpointName}": {
      "get": {
        "tags": [
          "healthcheck"
        ],
        "parameters": [
          {
            "name": "endpointName",
            "schema": {
              "enum": [
                "ENDPOINTA",
              "ENDPOINTB"
              ],
              "type": "string"
            },
            "in": "path",
            "required": true
          }
        ],
        "responses": {
          "200": {
            "description": "Returns an EndpointStatus object representing state of a camel endpoint"
          }
        },
        "operationId": "getStatus",
        "summary": "Get Camel Status",
        "x-camelContextId": "camel-1",
        "x-routeId": "getStatus"
      }
    },
    "/healthcheck/isAvailable": {
      "get": {
        "tags": [
          "healthcheck"
        ],
        "responses": {
          "200": {
            "description": "Returns status code 200 when Camel is available"
          }
        },
        "operationId": "verb1",
        "summary": "Is Camel Available",
        "x-camelContextId": "camel-1",
        "x-routeId": "route4"
      }
    }
  },
  "components": {
    "schemas": {
      "EndpointStatus": {
        "type": "EndpointStatus",
        "x-className": {
          "format": "com.sample.bean.EndpointStatus",
          "type": "string"
        }
      }
    }
  },
  "tags": [
    {
      "name": "healthcheck",
      "description": "Health Check REST service"
    }
  ]
}

I have tried adding this into my responseMessage and it is still not documenting correctly;

responseMessage().code(200).responseModel(EndpointStatus.class).message("Returns an EndpointStatus object representing state of a camel endpoint").endResponseMessage()

Do I need different annotations / RestDefinition config to get this EndpointStatus class appearing correctly in the OpenAPI documentation?

1

1 Answers

0
votes

This looks to be an issue at the moment with the camel-openapi-java component; waiting for a resolution from this jira https://issues.apache.org/jira/browse/CAMEL-15158