0

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 オブジェクトに変換したいと思います。しかし、春のソーシャルFacebookを使用してそれを行う方法がわかりません。

私は試しましfacebook.fetchObject(like.object_id, PostType.STATUS)た。しかし、それは間違った方法のようです。

GET クエリから生の JSON 応答を解析せずに、Spring Social で「object_id」を解析する方法はありますか?

私はこれを試しました:

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)
4

1 に答える 1

2

「解析」の意味がまだわかりません。しかし、とにかくこれに答えようとしましょう...

オブジェクトを 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」フィールドにコピーしていることがわかります。これらのフィールドの 1 つは Post の type プロパティを設定するために使用され、もう 1 つは Post のどの特定のサブクラスを作成する必要があるかを決定するために使用されます。これは、Jackson 1.9.x で発生した問題を回避するためのハックです...Jackson 2 ではそのハックは不要になると思いますが、まだ試していません。

したがって、これを行うための実用的な方法は 1 つしかないと思います。すべての作業を自分で行わないでください。代わりに facebook.feedOperations().getPost(objectId) を使用してください。それは、あなたに Post オブジェクトを与える魔法を隠れて行う方法を知っています。そこから、特定の種類の Post がわかっている場合は、必要に応じて (必要に応じて) LinkPost、StatusPost などにキャストできます。

私が見る唯一の他のオプションは、さらに低いレベルに移動し、facebook.restOperations() を介してリクエストを行い、バインディングを自分で処理することです。それは明らかにあなたの側のより多くの仕事です。

于 2013-06-06T16:20:11.293 に答える