2014-02-07 4 views
2

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

Мы получаем доступ АНИ следующим образом: 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, кажется, используйте устаревший подход (ссылки, упомянутые выше).

Любые идеи, как это решить? Любые альтернативы?

ответ

2

Имеется ли контейнер, который вы загружаете? Метод 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().

+0

Большое спасибо! Контейнер существует - я забыл упомянуть об этом. Когда я создал новый контейнер, он работал отлично. Я все еще получаю ContainerNotFoundException, если пытаюсь получить доступ к существующему контейнеру. –