如何在使用google-api和Atom序列化/解析器时设置默认名称空间或如何定义@key值



我在Atom解析/序列化方面遇到了麻烦——显然与名称空间和默认别名有关——但我不知道我做错了什么。

我有两个方法-一个是我试图做一个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:标题——我不明白,但它有效。

问题是,我不能得到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(); 

传输和命名空间为:

private static final HttpTransport transport = new 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/系统。err(1957): java.lang.IllegalArgumentException:无法识别的别名:(默认)W/系统。err(1957): at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)W/系统。错误(1957):at com.google.api.client.xml. xmlnamespacdictionary . getnamespaceuriforaliashandlingunknown (xmlnamespacdictionary .java:288)W/系统。err(1957): at com.google.api.client.xml. xmlnamespacdictionary.com startdoc (xmlnamespacdictionary.com java:224)

如果我使用

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

,然后它确实序列化,但每个元素都有atom:前缀,调用失败-当我对它执行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同时管理名称空间?

看起来您正在添加重复的字典键或序列化器无法理解的键。

请使用以下语句。

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");

删除"atom"项名称空间的显式集合为我解决了这个问题。

最新更新