1

Atomの解析/シリアル化(明らかに名前空間とデフォルトのエイリアスに関連するもの)に問題がありますが、何が間違っているのか理解できません。

2つの方法があります。1つはGETを実行してアルバムが定義されているかどうかを確認する方法と、POSTを実行してアルバムを作成しようとする方法(存在しない場合)です。

GETはなんとか機能しましたが、PicasaAndroidSampleとは異なるため、何か間違ったことをしていると確信しています。具体的には、次のように定義します。

public class EDAlbum  {

    @Key("atom:title")
    public String title;

    @Key("atom:summary")
    public String summary;

    @Key("atom:gphoto:access")
    public String access;

    @Key("atom:category")
    public EDCategory category = EDCategory.newKind("album"); 
}

次に、次のコードは実際にすべてのアルバムを取得します。

PicasaUrl url = PicasaUrl.relativeToRoot("feed/api/user/default");
HttpRequest request = EDApplication.getRequest(url);
HttpResponse res = request.execute();
EDAlbumFeed feed = res.parseAs(EDAlbumFeed.class);
boolean hasEDAlbum = false;
            for (EDAlbum album : feed.items) {
                if (album.title.equals(EDApplication.ED_ALBUM_NAME)) {
                    hasEDAlbum = true;
                    break;
                }
            }

しかし-代わりに私が持っている場合:

public class EDAlbum  {

    @Key("title")
    public String title;

    @Key("summary")
        public String summary;

    @Key("gphoto:access")
    public String access;

    @Key("category")
        public EDCategory category = EDCategory.newKind("album"); 
}

次に、フィードには空のコレクションがあります。つまり、パーサーはこれがAtomであることを認識していません(私の推測)。

私はクラスでandroid:titleと一緒に暮らすことができます-私はそれを取得しませんが、それは機能します。

問題は、POSTを(アルバムを作成するために)中華なべにすることができないことです。このコードは次のとおりです。

EDAlbum a = new EDAlbum();
a.access = "public";
a.title = EDApplication.ED_ALBUM_NAME;
a.summary = c.getString(R.string.ed_album_summary);
AtomContent content = new AtomContent();
content.entry = a;  
content.namespaceDictionary = EDApplication.getNamespaceDictionary();
PicasaUrl url = PicasaUrl.relativeToRoot("feed/api/user/default");
HttpRequest request = EDApplication.postRequest(url, content);
HttpResponse res = request.execute(); 

トランスポートと名前空間は次のとおりです。

プライベート静的最終HttpTransportトランスポート=新しいApacheHttpTransport(); //私のライブラリにはGoogleTransportが含まれていません。

private static HttpRequestFactory createRequestFactory(final HttpTransport transport) {

        return transport.createRequestFactory(new HttpRequestInitializer() {
         public void initialize(HttpRequest request) {
          AtomParser parser = new AtomParser();
          parser.namespaceDictionary = getNamespaceDictionary();
          request.addParser(parser);
         }
      });
 } 

public static XmlNamespaceDictionary getNamespaceDictionary() {
        if (nsDictionary == null) {
            nsDictionary = new XmlNamespaceDictionary();
            nsDictionary.set("", "http://www.w3.org/2005/Atom");
            nsDictionary.set("atom", "http://www.w3.org/2005/Atom");
            nsDictionary.set("exif", "http://schemas.google.com/photos/exif/2007");
            nsDictionary.set("gd", "http://schemas.google.com/g/2005");
            nsDictionary.set("geo", "http://www.w3.org/2003/01/geo/wgs84_pos#");
            nsDictionary.set("georss", "http://www.georss.org/georss");
            nsDictionary.set("gml", "http://www.opengis.net/gml");
            nsDictionary.set("gphoto", "http://schemas.google.com/photos/2007");
            nsDictionary.set("media", "http://search.yahoo.com/mrss/");
            nsDictionary.set("openSearch", "http://a9.com/-/spec/opensearch/1.1/");
            nsDictionary.set("xml", "http://www.w3.org/XML/1998/namespace");
        }
        return nsDictionary;
}

使用する場合

@Key("title")
public String title;

次に、デフォルトの名前空間がないという例外が発生します。

W / System.err(1957):java.lang.IllegalArgumentException:認識されないエイリアス:(デフォルト)W / System.err(1957):com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)W /System.err(1957):com.google.api.client.xml.XmlNamespaceDictionary.getNamespaceUriForAliasHandlingUnknown(XmlNamespaceDictionary.java:288)W / System.err(1957):com.google.api.client.xml.XmlNamespaceDictionary .startDoc(XmlNamespaceDictionary.java:224)

そして私が使用する場合

@Key("atom:title")
public String title;

次に、シリアル化されますが、各要素にはアトム:プレフィックスがあり、呼び出しは失敗します-tcpdumpを実行すると、次のように表示されます。

.`....<? xml vers
ion='1.0 ' encodi
ng='UTF- 8' ?><at
om:entry  xmlns:a
tom="htt p://www.
w3.org/2 005/Atom
"><atom: category
 scheme= "http://
schemas. google.c
om/g/200 5#kind" 
term="ht tp://sch
emas.goo gle.com/
photos/2 007#albu
m" /><at om:gphot
o:access >public<
/atom:gp hoto:acc
....

使用するには何を変える必要がありますか

@Key("title")
public String title;

GETとPOSTの両方で名前空間を管理しますか?

4

2 に答える 2

0

重複した辞書キーまたはシリアライザーが認識しないキーを追加しているようです。

代わりに以下を使用してください。

static final XmlNamespaceDictionary DICTIONARY = new XmlNamespaceDictionary()
      .set("", "http://www.w3.org/2005/Atom")
      .set("activity", "http://activitystrea.ms/spec/1.0/")
      .set("georss", "http://www.georss.org/georss")
      .set("media", "http://search.yahoo.com/mrss/")
      .set("thr", "http://purl.org/syndication/thread/1.0");
于 2012-03-09T05:49:06.660 に答える
0

「atom」アイテム名前空間の明示的なセットを削除すると、この問題が解決しました。

于 2012-06-24T22:16:01.103 に答える