从 jclouds 1.5 迁移到 1.7 后 rackspace cloudfiles 抛出 ContainerNotFoundException
Posted
技术标签:
【中文标题】从 jclouds 1.5 迁移到 1.7 后 rackspace cloudfiles 抛出 ContainerNotFoundException【英文标题】:rackspace cloudfiles throws ContainerNotFoundException after migration from jclouds 1.5 to 1.7 【发布时间】:2014-03-04 15:44:24 【问题描述】:我正在尝试将我们使用的 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 项目中的示例似乎使用了已弃用的方法(上面提到的链接)。
任何想法如何解决这个问题?有其他选择吗?
【问题讨论】:
【参考方案1】:您要上传到的容器是否存在? 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()
的位置来转换为新样式。
【讨论】:
非常感谢!容器存在 - 我忘了提。当我创建一个新容器时,它运行良好。如果我尝试访问现有容器,我仍然会收到 ContainerNotFoundException。以上是关于从 jclouds 1.5 迁移到 1.7 后 rackspace cloudfiles 抛出 ContainerNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
Django 1.7 vs Django1.6 vs Django 1.5 [关闭]