2014-02-07 42 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。 –