Spring Facebook Template map fetchObject to PagedL

2019-05-26 01:25发布

I'm using the following approach to return a Facebook user's music preferences:

//FIXME: Fetch results in a single operation
val likes = facebook.likeOperations().music
val artists = ArrayList<Artist>()
for (musicLiked in likes)
{
    val musicProfile = facebook.fetchObject(musicLiked.id, Page::class.java, "id", "name", "genre");
    artists.add(Artist(name = musicProfile.name, genre = musicProfile.genre))
}

The above approach won't scale, since we have an additional network operation for each artist the user likes.

I tried:

I tried using facebook.likeOperations.music however this doesn't fetch genre.

Question:

I would like to use facebook.fetchObject with a query that returns a PagedList. How to do this?

(No need to post example code in Kotlin if you prefer or are more familiar with Java - I'll be happy with information in any language).

2条回答
萌系小妹纸
2楼-- · 2019-05-26 01:40

Thanks to advice given in @burovmarley's answer, I inspected the source and came up with:

val music = facebook.fetchConnections(userPage.id, "music", Page::class.java,
            PagingParameters(25, 0, null, null).toMap(), "id,name,,genre")
for (musicLiked in music)
{
    println("likes: ${musicLiked.name}, genre: ${musicLiked.genre}")
}

This allows using Spring Social Facebook as an unmodified dependency, and without issuing a pull request, which seem to be fairly slow in processing through the queue at the present time.

查看更多
劫难
3楼-- · 2019-05-26 01:42

Facebook api uses "fields" parameter in requests to return custom fields for objects. This parameter can be also used for liked music rest request.



    me/music?fields=id,genre,name

above link will return all liked music with id, genre and name of the artist/group. Unfortunately FacebookTemplate does not have method which will apply for your needs. The method Facebook.likeOperations() returns instance of the LikeTemplate class which has constant PAGE_FIELDS with value



    private static final String PAGE_FIELDS = "id,name,category,description,location,website,picture,phone,affiliation,company_overview,likes,checkins";

In above constant you do not have genre field. So you have two ways:

  1. You can simply use facebook rest api with some rest library
  2. You can override FacebookTemplate and return your own implementation of LikeTemplate as result of the likeOperations() method. You implementation of the LikeTemplate class should have different value in mentioned constant (added genre field at the end of the string)

Maybe some one will be more helpful but in my knowledge you do not have other options.

查看更多
登录 后发表回答