Невозможно создать необходимый тип возвращаемого значения сгенерированного HTTP-клиента, поскольку нет TypeConverter из ByteBuffer в класс java.io. Файл: Micronaut

Ниже приведен код на стороне сервера для отправки файла клиенту в качестве ответа отдыха с использованием micronaut.

@Get(value = "/downloadFile", produces = MediaType.APPLICATION_OCTET_STREAM )
public HttpResponse<File> downloadDocument() throws IOException {

    File sampleDocumentFile = new File(getClass().getClassLoader().getResource("SampleDocument.pdf").getFile());

    return HttpResponse.ok(sampleDocumentFile).header("Content-Disposition", "attachment; filename=\"" + sampleDocumentFile.getName() + "\"" );
}

Ниже показан клиент для вызова указанной выше конечной точки.

@Client(value = "/client")
public interface DownloadDocumentClient {

@Get(value = "/downloadDocument", processes = MediaType.APPLICATION_OCTET_STREAM)
public Flowable<File> downloadDocument();

}

Пытался получить файл, как показано ниже:-

Flowable<File> fileFlowable = downloadDocumentClient.downloadDocument();
    Maybe<File> fileMaybe = fileFlowable.firstElement();
    return fileMaybe.blockingGet();

Получение исключения как

io.micronaut.context.exceptions.ConfigurationException: невозможно создать сгенерированный тип возвращаемого значения HTTP-клиента, поскольку не зарегистрирован TypeConverter из ByteBuffer в класс java.io.File

1 ответ

Решение

Вы не можете отправить данные файла, используя Fileэкземпляр, потому что он содержит только путь, а не содержимое файла. Вы можете отправить содержимое файла, используя массив байтов.

Обновите контроллер таким образом:

@Get(value = "/download", produces = MediaType.APPLICATION_OCTET_STREAM)
public HttpResponse<byte[]> downloadDocument() throws IOException, URISyntaxException {
    String documentName = "SampleDocument.pdf";
    byte[] content = Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource(documentName).toURI()));
    return HttpResponse.ok(content).header("Content-Disposition", "attachment; filename=\"" + documentName + "\"");
}

Клиент тогда будет так:

@Get(value = "/download", processes = MediaType.APPLICATION_OCTET_STREAM)
Flowable<byte[]> downloadDocument();

И, наконец, звонок клиента:

Flowable<byte[]> fileFlowable = downloadDocumentClient.downloadDocument();
Maybe<byte[]> fileMaybe = fileFlowable.firstElement();
byte[] content = fileMaybe.blockingGet();

Обновление: если вам нужно сохранить полученные байты (содержимое файла) в файл на клиентской машине (контейнере), вы можете сделать это, например, следующим образом:

Path targetPath = Files.write(Paths.get("target.pdf"), fileMaybe.blockingGet());

И если вам действительно нужен экземпляр File вместо того Path для дальнейшей обработки просто:

File file = targetPath.toFile();
Другие вопросы по тегам