rackspace cloudfiles выдает исключение ContainerNotFoundException после миграции с jclouds 1.5 на 1.7

Я пытаюсь обновить библиотеки jclouds, которые мы используем, с версии 1.5 до 1.7.

Мы получаем доступ к API следующим образом: https://github.com/jclouds/jclouds-examples/tree/master/rackspace/src/main/java/org/jclouds/examples/rackspace/cloudfiles

private RestContext<CommonSwiftClient, CommonSwiftAsyncClient> swift;
BlobStoreContext context = ContextBuilder.newBuilder(PROVIDER)
.credentials(username, apiKey)
.buildView(BlobStoreContext.class);

swift = context.unwrap();

RestContext устарел с версии 1.6. http://demobox.github.io/jclouds-maven-site-1.6.0/1.6.0/jclouds-multi/apidocs/org/jclouds/rest/RestContext.html.

Я пытался заставить его работать так:

ContextBuilder contextBuilder = ContextBuilder.newBuilder(rackspaceProvider)
.credentials(rackspaceUsername, rackspaceApiKey);
rackspaceApi = contextBuilder.buildApi(CloudFilesClient.class);

Во время выполнения при загрузке файла я получаю следующую ошибку:

org.jclouds.blobstore.ContainerNotFoundException

Примеры в проекте jclouds github, похоже, используют устаревший подход (ссылки, упомянутые выше).

Есть идеи, как это решить? Есть альтернативы?


person Robert Stöttner    schedule 07.02.2014    source источник


Ответы (1)


Существует ли контейнер, в который вы загружаете? Метод putObject не создает автоматически контейнер, который вы называете, если он не существует; сначала вам нужно явно вызвать createContainer, чтобы создать его.

Вот пример, который создает контейнер и загружает в него файл:

CloudFilesClient client = ContextBuilder.newBuilder("cloudfiles-us")
    .credentials(USERNAME, APIKEY)
    .buildApi(CloudFilesClient.class);

client.createContainer("sample");

SwiftObject object = client.newSwiftObject();
object.getInfo().setName("somefile.txt");
object.setPayload("file or bytearray or something else here");
client.putObject("sample", object);

// ...

client.close();

Вы правы, что примеры в jclouds-examples по-прежнему ссылаются на RestClient, но вы должны иметь возможность преобразовать его в новый стиль, подставив свой объект rackspaceApi там, где они вызывают swift.getApi().

person Ash Wilson    schedule 10.02.2014
comment
Большое спасибо! Контейнер существует - забыл об этом упомянуть. Когда я создал новый контейнер, он работал идеально. Я по-прежнему получаю исключение ContainerNotFoundException, если пытаюсь получить доступ к существующему контейнеру. - person Robert Stöttner; 13.02.2014