I am trying to download a file from S3 using S3AsyncClient's getObject(objectRequest, AsyncResponseTransformer.toBlockingInputStream())
which returns a CompletableFuture<ResponseInputStream<GetObjectResponse>>
in my controller. But it throws below the exception.
Exception Message:
org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:322)
Controller
import software.amazon.awssdk.core.ResponseInputStream;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
@RestController
@RequestMapping("api/vone/sthreedownload")
public class S3Controller {
private S3Service s3service;
public S3Controller(S3Service s3service) {
this.s3service = s3service;
}
@GetMapping(value="/download-file/{id}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE )
public CompletableFuture<ResponseInputStream<GetObjectResponse>> downloadFileFromS3(String id){
return s3service.downLoadFile(id);
}
}
Service
@Service
public class S3Service {
private S3AsyncClient s3CAsyncClient;
public S3Service(S3AsyncClient s3cAsyncClient) {
s3CAsyncClient = s3cAsyncClient;
}
@Async
public CompletableFuture<ResponseInputStream<GetObjectResponse>> downLoadFile(String id) {
GetObjectRequest objectRequest = GetObjectRequest.builder().key(id).bucket("BCD").build();
return s3CAsyncClient.getObject(objectRequest, AsyncResponseTransformer.toBlockingInputStream());
}
}