从jclouds 1.5迁移到1.7后,rackspace cloudfiles抛出ContainerNotFoundException

时间:2014-02-07 09:43:37

标签: java rackspace cloudfiles jclouds

我正在尝试更新我们在1.5到1.7版本中使用的jclouds库。

我们通过以下方式访问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项目中的示例似乎使用了弃用的方法(上面提到的Links)。

任何想法如何解决这个问题?任何替代方案?

1 个答案:

答案 0 :(得分: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的{​​{1}}对象来转换为新的样式。 }}