Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修改了DoubanSubjectObj某些字段的@Key使得SDK能够获取attribute,tag字段数据 #14

Open
wants to merge 2 commits into
base: origin
Choose a base branch
from

Conversation

ostinatos
Copy link

com.dongxuexidu.douban4j.service.DoubanBookMovieMusicService#getMusicInfoById
这个方法无法获取db:attribute或者db:tag的字段。
其它类似的方法应该也有类似问题。

样例请求:
https://api.douban.com/music/subject/4753298
原因是在于sdk中请求的是https的douban API,而https的API对应的alias是db2而不是db。
因此google的api在反序列化的时候没有把attribute和tag字段转换出来。

将java bean里相应字段的@key改为db2就可以了。

如下方法测试通过:
com.dongxuexidu.douban4j.service.DoubanBookMovieMusicServiceTest#testGetMusicInfoById

ps. 另外不小心修改了.gitignore也提交了,只是忽略掉idea IDE相关的文件,干脆也一并PR了。:)

@UglyTroLL
Copy link
Owner

多谢!为何我在https://api.douban.com/music/subject/4753298 里看到的还是db:tag而不是db2:tag?
screen shot 2015-12-14 at 1 33 14 pm

@ostinatos
Copy link
Author

这个我也发现了,但是说实话还没研究这个问题。
从调试的结果来看的确是https的namespace要对应db2
过两天我有时间再研究下

2016......
今天终于看了下这个问题 :)
原因是在以下类中:
com.dongxuexidu.douban4j.constants.DefaultConfigs
定义了默认的几个namespace,定义了默认的alias - uri关系

public static final XmlNamespaceDictionary DOUBAN_XML_NAMESPACE = new XmlNamespaceDictionary()
          .set("", "http://www.w3.org/2005/Atom")
          .set("db", "http://www.douban.com/xmlns/")
          .set("gd", "http://schemas.google.com/g/2005")
          .set("opensearch", "http://a9.com/-/spec/opensearchrss/1.0/");

而在作者使用的google XML api中,也会对namespace进行处理
逻辑是基于response中的namespace定义,按uri将alias加入到namespaceDictionary中,并发现如果alias已经存在的话,就会自动给alias加上后缀,所以就出现了db2的alias了,源码如下:
com.google.api.client.xml.Xml

private static void parseNamespacesForElement(
      XmlPullParser parser, XmlNamespaceDictionary namespaceDictionary)
      throws XmlPullParserException {
    int eventType = parser.getEventType();
    Preconditions.checkState(eventType == XmlPullParser.START_TAG,
        "expected start of XML element, but got something else (event type %s)", eventType);
    int depth = parser.getDepth();
    int nsStart = parser.getNamespaceCount(depth - 1);
    int nsEnd = parser.getNamespaceCount(depth);
    for (int i = nsStart; i < nsEnd; i++) {
      String namespace = parser.getNamespaceUri(i);
      // if namespace isn't already in our dictionary, add it now
      if (namespaceDictionary.getAliasForUri(namespace) == null) {
        String prefix = parser.getNamespacePrefix(i);
        String originalAlias = prefix == null ? "" : prefix;
        // find an available alias
        String alias = originalAlias;
        int suffix = 1;
        while (namespaceDictionary.getUriForAlias(alias) != null) {
          suffix++;
          alias = originalAlias + suffix;
        }
        namespaceDictionary.set(alias, namespace);
      }
    }
  }

我试了下,把DefaultConfigs中的DOUBAN_XML_NAMESPACE去掉,也就是把默认的namespace映射去掉,就不需要修改bean里的注解,也可以正常取到字段数据。

不知道作者当时加这个默认namespace映射的目的是?

@corningsun
Copy link
Contributor

的确,去掉默认配置就好啦,@UglyTroLL 抽空更新下吧?

  public static final XmlNamespaceDictionary DOUBAN_XML_NAMESPACE = new XmlNamespaceDictionary()
//          .set("", "http://www.w3.org/2005/Atom")
//          .set("db", "http://www.douban.com/xmlns/")
//          .set("gd", "http://schemas.google.com/g/2005")
//          .set("opensearch", "http://a9.com/-/spec/opensearchrss/1.0/")
          ;

@UglyTroLL
Copy link
Owner

多谢二位!我这就去更新
我记得当时这段儿是douban 1.0官方例子里我照抄过来的 lol

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants