2014-02-07 68 views
2

我正在嘗試更新我們從版本1.5到1.7使用的jclouds庫。rackspace cloudfiles從jclouds 1.5遷移到1.7後拋出ContainerNotFoundException

我們訪問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(); 

因爲1.6 RestContext已被棄用。 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。 –