【问题标题】:Read Facebook Post-related Object with Spring Social使用 Spring Social 阅读 Facebook 帖子相关对象
【发布时间】:2023-03-30 10:35:01
【问题描述】:

我使用带有Spring Social Facebook 的 FQL 阅读了所有我喜欢的内容

方法如下:

public List<LikeObject>  startF(String token){
    Facebook facebook = new FacebookTemplate(token);
    FacebookProfile profile = facebook.userOperations().getUserProfile();
    //System.out.println(facebook.isAuthorized());
    System.out.println("Authenticcated user: "+profile.getFirstName()+" "+profile.getLastName());
    PagedList<String> friendListIds =  facebook.friendOperations().getFriendIds();

    List<LikeObject> resultsLikes = facebook.fqlOperations().query("SELECT object_id, object_id_cursor,object_type, post_id, post_id_cursor, user_id "+
            "FROM like "+
            "WHERE user_id =me() ",  new FqlResultMapper<LikeObject>(){
        public LikeObject mapObject(FqlResult result) {
            LikeObject like = new LikeObject();
            like.object_id = result.getString("object_id");
            like.object_id_cursor =  result.getString("object_id_cursor");
            like.object_type = result.getString("object_type");
            like.post_id = result.getString("post_id"); 
            like.post_id_cursor = result.getString("post_id_cursor");
            like.user_id = result.getString("user_id");
            return like;
        }
    });
    return resultsLikes;
}       

这里的结果:

LikeObject [object_id=578416.., object_id_cursor=null, object_type=status, post_id=, post_id_cursor=null, user_id=10217..]

然后我想解析 like.object_id 并将其转换为 java 对象。但我不知道如何使用 spring social facebook 来做到这一点。

我试过 facebook.fetchObject(like.object_id, PostType.STATUS) 。但这似乎是一种错误的方式。

是否有任何可能的方法来解析 spring social 中的“object_id”而不解析来自 GET 查询的原始 JSON 响应?

我试过这个:

LinkPost post = facebook.fetchObject(obj_id, LinkPost.class);

我相信 obj_id 有类型 link,我已经检查过了

它会导致以下异常:

Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'postType' that is to contain type id  (for class org.springframework.social.facebook.api.LinkPost)
 at [Source: java.io.ByteArrayInputStream@6ca79a6a; line: 1, column: 11114]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'postType' that is to contain type id  (for class org.springframework.social.facebook.api.LinkPost)
 at [Source: java.io.ByteArrayInputStream@6ca79a6a; line: 1, column: 11114]
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:171)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:163)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:94)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:491)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:460)
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:228)
    at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:202)
    at com.repost.facebook.FbConnection.getLikedPosts(FbConnection.java:58)
    at com.repost.facebook.MainClass.main(MainClass.java:15)

【问题讨论】:

  • “解析一个‘object_id’是什么意思?”您是在问是否有办法确定该 id 背后的对象类型?
  • 嗨克雷格!我知道对象的类型。在我的示例中,Facebook 将它作为 object_type=status 返回给我。我想通过使用 object_id 给出的参考链接将它解析为 StatusPost 类的对象

标签: java facebook api spring-social


【解决方案1】:

我仍然不清楚您所说的“解析”是什么意思。但无论如何,让我尝试回答这个问题......

我认为您只是希望能够将对象作为 Post(或 LinkPost)对象获取……对吗?如果是这样,那么不幸的是,我不得不将一些特殊的魔法融入到 API 中,以便能够同时获取帖子类型将多态反序列化为特定类型的帖子(例如,LinkPost、StatusPost、等等)。

您可以在https://github.com/SpringSource/spring-social-facebook/blob/master/spring-social-facebook/src/main/java/org/springframework/social/facebook/api/impl/FeedTemplate.java 中看到设置。在 deserializePost() 方法中,您会看到我读取了“type”属性并将其复制到新的“postType”字段中。其中一个字段用于填充 Post 的 type 属性,另一个用于确定应创建 Post 的哪个特定子类。解决我在使用 Jackson 1.9.x 时遇到的问题是一种 hack……我认为 Jackson 2 会让这种 hack 变得不必要,但我还没有尝试过。

因此,我认为只有一种可行的方法:不要自己完成所有工作。而是使用 facebook.feedOperations().getPost(objectId)。它知道如何在幕后施展魔法来给你一个 Post 对象。从那里,如果您知道特定类型的 Post,您可以将其转换为(如果)需要 LinkPost、StatusPost 等。

我看到的唯一其他选择是降低级别并通过 facebook.restOperations() 发出请求并自己处理绑定。显然,您需要做更多的工作。

【讨论】:

  • 谢谢!这正是我的问题。抱歉不清楚。
  • 克雷格,仅供参考,我看到的东西看起来很相似(FB 响应的解析问题)。我的代码试图回复评论:CommentOperations co = template.commentOperations(); String replyId = co.addComment(commentId, commentResponse);其结果是来自 MappingJackson2HttpMessageConverter 类的 HttpMessageNotReadableException。根据您使用 facebook.restOperations() 机制的建议,我可以解决此错误,但我想报告我所看到的。
猜你喜欢
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多