Я обновляю azure sdk для java до версии 12.21.1. Весенняя загрузочная версия — 2.1.6. Я использую следующую зависимость в gradle: реализация 'com.azure:azure-storage-blob:12.21.1'.
Я использую следующий код для создания BlobServiceClient:
String accountUrl = "https://" + accountName + ".blob.core.windows.net";
StorageSharedKeyCredential sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
try{
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().credential(sharedKeyCredential).endpoint(accountUrl).buildClient();
}
Но во время выполнения выдает ошибку:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: reactor/util/context/ContextView] with root cause
java.lang.ClassNotFoundException: reactor.util.context.ContextView
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na]
BuiltinClassLoader.java:581
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
ClassLoaders.java:178
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
ClassLoader.java:522
at com.azure.core.http.policy.HttpPolicyProviders.addAfterRetryPolicies(HttpPolicyProviders.java:52) ~[azure-core-1.37.0.jar:1.37.0]
HttpPolicyProviders.java:52
at com.azure.storage.blob.implementation.util.BuilderHelper.buildPipeline(BuilderHelper.java:128) ~[azure-storage-blob-12.21.1.jar:12.21.1]
BuilderHelper.java:128
at com.azure.storage.blob.BlobServiceClientBuilder.buildAsyncClient(BlobServiceClientBuilder.java:135) ~[azure-storage-blob-12.21.1.jar:12.21.1]
BlobServiceClientBuilder.java:135
at com.azure.storage.blob.BlobServiceClientBuilder.buildClient(BlobServiceClientBuilder.java:114) ~[azure-storage-blob-12.21.1.jar:12.21.1]
Как это решить?
Да. Я хочу загружать/загружать файлы из BLOB-объектов с помощью java azure sdk.
java.lang.NoClassDefFoundError: реактор/утилита/контекст/ContextView
Это может быть из-за отсутствия зависимости в вашем приложении. Проверьте, добавили ли вы необходимые зависимости в путь к классам вашего проекта.
Я воспроизвел ваше требование для отправки/скачивания файла с помощью Azure Java SDK.
Ниже приведены зависимости, которые я использовал в своем приложении.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation group: 'com.azure', name: 'azure-storage-blob', version: '12.16.0'
implementation group: 'com.microsoft.azure', name: 'azure-storage-spring-boot-starter', version: '2.2.5'
implementation group: 'commons-fileupload', name: 'commons-fileupload', version: '1.4'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Обратите внимание на токен доступа вашей учетной записи хранения на портале Azure:
Я создал простой API для вызова этого метода, который создает файл и загружает его из хранилища BLOB-объектов Azure.
@PostMapping("/upload")
public void uploadFile(@RequestParam(value = "file") MultipartFile file) throws IOException {
// Code To Create and File In Blob Storage
String str = "DefaultEndpointsProtocol=https;AccountName=<storage_account_name>;AccountKey=storage_account_access_key;EndpointSuffix=core.windows.net";
OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);
BlobSasPermission permission = new BlobSasPermission().setReadPermission(true);
BlobServiceSasSignatureValues values = new BlobServiceSasSignatureValues(expiryTime, permission).setStartTime(OffsetDateTime.now());
BlobContainerClient container = new BlobContainerClientBuilder().connectionString(str).containerName("<conatiner_name>").buildClient();
BlobClient blob = container.getBlobClient(file.getOriginalFilename());
blob.upload(file.getInputStream(), file.getSize(), true);
String sasToken = blob.generateSas(values);
// Code To Create and File In Blob Storage
// Code To download the File From Blob Storage
URL url = new URL(blob.getBlobUrl() + "?" + sasToken);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
int responseCode = httpConn.getResponseCode();
// Check if the response code is HTTP_OK (200)
if (responseCode == HttpURLConnection.HTTP_OK) {
// Open input stream from the HTTP connection
InputStream inputStream = httpConn.getInputStream();
// Open output stream to save the file
FileOutputStream outputStream = new FileOutputStream("C:\\Users\\win10\\Downloads\\data.txt");
// Read bytes from input stream and write to output stream
int bytesRead;
byte[] buffer = new byte[4096];
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
// Close streams
outputStream.close();
inputStream.close();
System.out.println("File downloaded");
} else {
System.out.println("Failed to download file: " + httpConn.getResponseMessage());
}
httpConn.disconnect();
// Code To download the File From Blob Storage
}
Вызов API, который я создал, и он генерирует URL-адрес для загрузки файла, который был загружен, как показано ниже:
Загрузил файл в хранилище BLOB-объектов Azure, используя приведенный выше код:
Используя приведенный выше код, загрузите файл как data.txt.
В этом случае вы используете версию весенней загрузки 2.1.6? Я знаю, что это должно работать с новыми версиями. Но я хочу решить эту проблему с помощью весенней загрузки 2.1.6.
Да, он будет работать с версией Spring Boot 2.1.6. Я проверил и подтвердил. Прикрепляю Изображение для ознакомления.
Похоже, между spring boot version и swagger возник конфликт зависимостей. Я обновил весеннюю загрузку до 2.7.10 и перешел на openAPI. После этого этот вопрос был решен. Спасибо.
Вы пытаетесь создать BlobServiceClient с помощью java sdk? Это ваше требование?