2

我正在尝试将我们使用的 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 项目中的示例似乎使用了已弃用的方法(上面提到的链接)。

任何想法如何解决这个问题?有什么选择吗?

4

1 回答 1

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()

于 2014-02-10T19:42:32.610 回答