3

I am trying to handle exceptions within my downloadfile Api. I am using openapi: "3.0.2" in springboot service. I tried implementing controlleradvice but OPEN API is not supporting Controlleradvice. Could you please suggest a standard approach or soulution which helps me in handling exceptions. Please find my delete file code below.

yml file

/namespace/{namespace}/bucket/{bucketName}/file/{fileName}:

get:
  operationId: downloadFileFromEcs
  summary: Download file from ECS
  description: |-
    Download file from ECS
  security:
    - x-et-auth-details: []
  tags:
    - ECS
  parameters:
    - in: path
      name: bucketName
      schema:
        type: string
        required: true
    - in: path
      name: namespace
      schema:
        type: string
        required: true
    - in: path
      name: fileName
      schema:
        type: string
        required: true

  responses:
    200:
      description: Downloaded file
      content:
        application/octet-stream:
          schema:
            $ref: "#/components/schemas/DownloadFile"
    400:
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error400BadRequest"
    403:
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error403AccessDenied"
    404:
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error404NotFound"
    500:
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error500InternalServerError"
    default:
      description: unexpected error
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"

Rest-api.java

 @ApiOperation(value = "Download file from ECS", nickname = "downloadFileFromEcs", notes = "Download file from ECS", response = org.springframework.core.io.Resource.class, tags={ "ECS", })
@ApiResponses(value = { 
    @ApiResponse(code = 200, message = "Downloaded file", response = org.springframework.core.io.Resource.class),
    @ApiResponse(code = 400, message = "", response = Error400BadRequest.class),
    @ApiResponse(code = 403, message = "", response = Error403AccessDenied.class),
    @ApiResponse(code = 404, message = "", response = Error404NotFound.class),
    @ApiResponse(code = 500, message = "", response = Error500InternalServerError.class),
    @ApiResponse(code = 200, message = "unexpected error", response = ErrorResponse.class) })
@RequestMapping(value = "/namespace/{namespace}/bucket/{bucketName}/file/{fileName}",
    produces = { "application/octet-stream", "application/json" }, 
    method = RequestMethod.GET)
default CompletableFuture<ResponseEntity<org.springframework.core.io.Resource>> _downloadFileFromEcs(@ApiParam(value = "",required=true) @PathVariable("bucketName") String bucketName
,@ApiParam(value = "",required=true) @PathVariable("namespace") String namespace
,@ApiParam(value = "",required=true) @PathVariable("fileName") String fileName
) {
        return downloadFileFromEcs(bucketName, namespace, fileName);
    }

// Override this method
default CompletableFuture<ResponseEntity<org.springframework.core.io.Resource>> downloadFileFromEcs(String bucketName,String namespace,String fileName) {
    if(getObjectMapper().isPresent() && getAcceptHeader().isPresent()) {
        if (getAcceptHeader().get().contains("application/json")) {
            try {
                return CompletableFuture.completedFuture(new ResponseEntity<>(getObjectMapper().get().readValue("\"\"", org.springframework.core.io.Resource.class), HttpStatus.NOT_IMPLEMENTED));
            } catch (IOException e) {
                log.error("Couldn't serialize response for content type application/json", e);
                return CompletableFuture.completedFuture(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
            }
        }
    } else {
        log.warn("ObjectMapper or HttpServletRequest not configured in default EcsApi interface so no example is generated");
    }
    return CompletableFuture.completedFuture(new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED));
}

Rest-impl.java

 @Override
public CompletableFuture<ResponseEntity<Resource>> downloadFileFromEcs(String bucketName,String namespace, String fileName) {
    // Load file as Resource
    logger.info("[ECS Controller] Download: Starting input stream");
    InputStream inputStream = ecsService.downloadFileFromS3Bucket(bucketName, namespace, fileName);
    logger.info("[ECS Controller] Download: Starting resource ");

    Resource resource = new InputStreamResource(inputStream);
    logger.info("[ECS Controller] setting fileDownloadResponse");
    String contentType = "application/octet-stream";
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.parseMediaType(contentType));
    logger.info("[ECS Controller] setting http headers");

/*        return CompletableFuture.completedFuture(ResponseEntity<ECSDownloadResponse>.ok()
                .contentType(MediaType.parseMediaType(contentType))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
                .body(resource));*/
        return CompletableFuture.completedFuture(new ResponseEntity<Resource>(
                resource,httpHeaders, HttpStatus.OK));
    }

ServiceIMPL.java

  public InputStream downloadFileFromS3Bucket(String bucket, String namespace, String fileName) throws AmazonS3Exception {
        if (!namespace.isEmpty() && namespace.equals("ac_gemsync")) {
            accessKey = accessKeyGem;
            secretKey = secretKeyGem;
        }
        if (!bucket.isEmpty()) {
            bucketName = bucket;
        }
        String result = "";
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        AmazonS3Client  s3client = new AmazonS3Client(credentials);
        s3client.setEndpoint(endpointUrl);
        S3ClientOptions options = new S3ClientOptions();
        options.setPathStyleAccess(true);
        s3client.setS3ClientOptions(options);
        logger.info("[ECS Download] Download: Starting s3 download");
        long startTime = System.currentTimeMillis();
        S3Object object = s3client.getObject(new GetObjectRequest(bucketName, fileName));
        long endTime = System.currentTimeMillis();
        long totalTime = endTime - startTime;
        logger.info("[ECS CALL] downloadFileFromS3Bucket: :" + totalTime + " milli secs");
        logger.info("[ECS Download] Download: Starting input stream");
        InputStream inputStream = object.getObjectContent();
        logger.info("[ECS Download] Done input stream");

    return inputStream;
}
Machavity
  • 30,841
  • 27
  • 92
  • 100
Hank
  • 31
  • 1
  • 3
  • 1
    in produces = { "application/octet-stream", "application/json" } put application/json first and add Accept */* or application/json in the client. it resolved for me – dae.eklen Aug 13 '20 at 13:36

0 Answers0