トップ回答者
Windows Azure Client Libraries for JavaのBlobコンテナの一覧取得メソッドでエラーが発生する。

質問
-
お世話になります。
標題の件について何かご存知の方がいましたら教えて下さい。
CloudBlobClientクラスのlistContainersメソッドを実行するエラーが発生します。
これは何が原因なのでしょうか?
単一コンテナの取得はできるものの、一覧の取得ができない状態です。
【エラー】
[Storage Exception]
The server encountered an unknown failure: OK[detail Message]
An error occurred while enumerating the result, check the original exception for details.【環境】
Windows XP
jdk1.6.0_33
microsoft-windowsazure-api-0.3.0.jar
【コード】
import com.microsoft.windowsazure.services.blob.client.CloudBlobClient;
import com.microsoft.windowsazure.services.blob.client.CloudBlobContainer;
import com.microsoft.windowsazure.services.core.storage.CloudStorageAccount;public class BolbUtils {
public static void main(String[] args) {
try {
// プロキシ設定
String proxyhost = "xxxxxxxxxxxxxxxxxx";
String proxyPort = "xxxxxxxxxx";
String nonProxyHosts = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
System.setProperty("http.proxyHost", proxyhost);
System.setProperty("http.proxyPort", proxyPort);
System.setProperty("https.proxyHost", proxyhost);
System.setProperty("https.proxyPort", proxyPort);// 認証
CloudStorageAccount account = null;
String protocol = "http";
String accountname = "xxxxxxxxxxxxxx";
String key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
StringBuilder sb = new StringBuilder();
sb.append("DefaultEndpointsProtocol=");
sb.append(protocol);
sb.append(";");
sb.append("AccountName=");
sb.append(accountname);
sb.append(";");
sb.append("AccountKey=");
sb.append(key);
sb.append(";");
account = CloudStorageAccount.parse(sb.toString());CloudBlobClient blobClient = account.createCloudBlobClient();
// コンテナリストの取得
Iterable<CloudBlobContainer> containerList = blobClient.listContainers();for (CloudBlobContainer container : containerList) {
System.out.println(container.getName());
}// コンテナの取得
CloudBlobContainer container = blobClient.getContainerReference("-------");
System.out.println(container.getName());} catch (Exception ee) {
System.out.println(ee.getMessage());
}}
}以上、宜しくお願いします。
【追記】
microsoft-windowsazure-api-0.2.2.jarで同じコードを実行すると、
エラーが出ませんでした。
0.3.3は、0.2.2からクラスの追加や修正などかなり修正が入っているようなので
Blobコンテナの一覧取得のやり方も変わったのでしょうか?
- 編集済み .NET初心者というより全て初心者 2012年7月18日 5:06
回答
-
すこしデバッグしてみましたが、やはりライブラリ側にバグがあるようです。
else if (name.equals(Constants.LEASE_STATUS_ELEMENT)) { properties.setLeaseStatus(LeaseStatus.parse(
Utility.readElementFromXMLReader(xmlr,Constants.COPY_STATUS_ELEMENT)));上記(改行コード変更)の COPY_STATUS_ELEMENTは誤りで、LEASE_STATUS_ELEMENT だと思われ、該当箇所を修正してみたら動作しました。
ソース修正できるようでしたら試してみてください。
- 回答としてマーク .NET初心者というより全て初心者 2012年7月26日 0:19
すべての返信
-
こちらでも0.3.0.jar を利用し、上記プログラムを実行したら例外が発生しました。
FiddlerにてHTTPの通信を確認しましたが、REST APIの発行は成功し、コンテナ一覧が取得できています。例外を見ると、Javaのライブラリ側でパースに失敗しているのかと思われますので、ライブラリの問題かもしれません。
Caused by: javax.xml.stream.XMLStreamException: LocalName CopyStatus specified did not match with current local name
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.require(Unknown Source)
at com.microsoft.windowsazure.services.core.storage.utils.Utility.readElementFromXMLReader(Utility.java:692)
at com.microsoft.windowsazure.services.core.storage.utils.Utility.readElementFromXMLReader(Utility.java:670)以下でなんらかのIssueが見つかるかも知れません。とりあえず、解決策ではありませんが、参考まで。
-
すこしデバッグしてみましたが、やはりライブラリ側にバグがあるようです。
else if (name.equals(Constants.LEASE_STATUS_ELEMENT)) { properties.setLeaseStatus(LeaseStatus.parse(
Utility.readElementFromXMLReader(xmlr,Constants.COPY_STATUS_ELEMENT)));上記(改行コード変更)の COPY_STATUS_ELEMENTは誤りで、LEASE_STATUS_ELEMENT だと思われ、該当箇所を修正してみたら動作しました。
ソース修正できるようでしたら試してみてください。
- 回答としてマーク .NET初心者というより全て初心者 2012年7月26日 0:19