2016-10-06 4 views
23

Я использовал версию 2.0.3.RELEASE из spring-social-facebook и Facebook app api v2.8. Я позвонил в Facebook, но вернул это сообщение. "(# 12) bio field устарел для версий v2.8 и выше" Как я могу это исправить?Сообщение об ошибке (# 12) bio field устарело для версий v2.8 и выше

+0

Существует ошибка слияния с PR для решения этой проблемы: http s: //github.com/spring-projects/spring-social-facebook/pull/218 – pca

+0

Любая идея, когда исправить будет проходить? Он все еще застрял там в 2.0.3 – dozer

+0

PR был слит. Доступна версия [v3.0.0.M1] (https://github.com/spring-projects/spring-social-facebook/releases/tag/v3.0.0.M1). – user6904265

ответ

46

У меня такая же ошибка, 2.0.3.RELEASE spring-social-facebook, похоже, несовместим с версией Facebook API версии v2.8 (выпущен вчера). Чтение из журнала изменений в facebook для v2.8 (https://developers.facebook.com/docs/apps/changelog):

User Bios - Биополе объекта User больше не доступно. Если для поля было установлено поле bio, значение теперь будет добавлено в поле about.

Думаю, нам нужно подождать нового выпуска библиотеки spring-social-facebook. В выпуске 2.0.3 (в интерфейсе org.springframework.social.facebook.api.UserOperations) есть поле bio в константе PROFILE_FIELDS и оно не поддерживается в версии API v2.8 facebook.

UPDATE: Я нашел обходной путь, в моем случае:

ДО:

Connection<Facebook> connection = facebookConnectionFactory.createConnection(accessGrant); 
Facebook facebook = connection.getApi(); 
User userProfile = facebook.userOperations().getUserProfile();//raises the exception caused by the "bio" field. 

ПОСЛЕ

Connection<Facebook> connection = facebookConnectionFactory.createConnection(accessGrant); 
Facebook facebook = connection.getApi(); 
String [] fields = { "id", "email", "first_name", "last_name" }; 
User userProfile = facebook.fetchObject("me", User.class, fields); 

Вот полный список поля можно использовать:

{ "id", "about", "age_range", "birthday", "context", "cover", "currency", "devices", "education", "email", "favorite_athletes", "favorite_teams", "first_name", "gender", "hometown", "inspirational_people", "installed", "install_type", "is_verified", "languages", "last_name", "link", "locale", "location", "meeting_for", "middle_name", "name", "name_format", "political", "quotes", "payment_pricepoints", "relationship_status", "religion", "security_settings", "significant_other", "sports", "test_group", "timezone", "third_party_id", "updated_time", "verified", "video_upload_limits", "viewer_can_send_gift", "website", "work"} 
+0

Это работает. Большой ! – Abhishek

+0

Я получаю следующую ошибку выше, любые предложения? {"errors": ["com.fasterxml.jackson.databind.JsonMappingException", "Невозможно создать экземпляр org.springframework.social.connect.UserProfile: не найдено подходящего конструктора, не может десериализоваться из значения Object (отсутствующий конструктор по умолчанию или создатель или, возможно, нужно добавить/включить информацию о типе?) \ n в [Источник: [email protected]; строка: 1, column: 2] "]} –

+0

Это решение является отличной заменой для' facebook.userOperations() .getUserProfile() 'без каких-либо параметров. Но как сделать то же самое, когда мы хотим получить пользовательский объект для другого идентификатора профиля? Например, как сделать то же самое для 'facebook.userOperations(). GetUserProfile (" some_facebook_id_here ")' – iamharish15

24

Обходное решение для JHipster. Добавьте следующий фрагмент в свой класс SocialService, пока не будет зафиксировано значение spring-social-facebook.

import java.lang.reflect.Field; 
import java.lang.reflect.Modifier; 
import javax.annotation.PostConstruct; 

@PostConstruct 
private void init() { 
    try { 
     String[] fieldsToMap = { "id", "about", "age_range", "birthday", 
       "context", "cover", "currency", "devices", "education", 
       "email", "favorite_athletes", "favorite_teams", 
       "first_name", "gender", "hometown", "inspirational_people", 
       "installed", "install_type", "is_verified", "languages", 
       "last_name", "link", "locale", "location", "meeting_for", 
       "middle_name", "name", "name_format", "political", 
       "quotes", "payment_pricepoints", "relationship_status", 
       "religion", "security_settings", "significant_other", 
       "sports", "test_group", "timezone", "third_party_id", 
       "updated_time", "verified", "viewer_can_send_gift", 
       "website", "work" }; 

     Field field = Class.forName(
       "org.springframework.social.facebook.api.UserOperations") 
       .getDeclaredField("PROFILE_FIELDS"); 
     field.setAccessible(true); 

     Field modifiers = field.getClass().getDeclaredField("modifiers"); 
     modifiers.setAccessible(true); 
     modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL); 
     field.set(null, fieldsToMap); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

Источник: https://github.com/jhipster/generator-jhipster/issues/2349 - минус bio в fieldsToMap массиве.

+0

работал для меня, спасибо! – Guilherme

+0

похоже, что мой код копируется по всему Интернету :) https://stackoverflow.com/a/34133450/1943228 – kamwo

+0

Причина, по которой идея аккуратная, многоразовая, и она работает. –

8
package hello; 

import org.springframework.social.connect.ConnectionRepository; 
import org.springframework.social.facebook.api.Facebook; 
import org.springframework.social.facebook.api.PagedList; 
import org.springframework.social.facebook.api.Post; 
import org.springframework.social.facebook.api.User; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
@RequestMapping("/") 
public class HelloController { 

    private Facebook facebook; 
    private ConnectionRepository connectionRepository; 

    public HelloController(Facebook facebook, ConnectionRepository connectionRepository) { 
     this.facebook = facebook; 
     this.connectionRepository = connectionRepository; 
    } 

    @GetMapping 
    public String helloFacebook(Model model) { 
     if (connectionRepository.findPrimaryConnection(Facebook.class) == null) { 
      return "redirect:/connect/facebook"; 
     } 
     String [] fields = { "id","name","birthday","email","location","hometown","gender","first_name","last_name"}; 
     User user = facebook.fetchObject("me", User.class, fields); 
     String name=user.getName(); 
     String birthday=user.getBirthday(); 
     String email=user.getEmail(); 
     String gender=user.getGender(); 
     String firstname=user.getFirstName(); 
     String lastname=user.getLastName(); 
     model.addAttribute("name",name); 
     model.addAttribute("birthday",birthday); 
     model.addAttribute("email",email); 
     model.addAttribute("gender",gender); 
     model.addAttribute("firstname",firstname); 
     model.addAttribute("lastname",lastname); 
     model.addAttribute("facebookProfile", facebook.fetchObject("me", User.class, fields)); 
     PagedList<Post> feed = facebook.feedOperations().getFeed(); 
     model.addAttribute("feed", feed); 
     return "hello"; 
    } 

} 
+1

Как вы получили данные этого поля? Я могу получить только имя, имя и фамилию, все остальное равно null. Мне особенно нужно иметь данные друзей. Таким образом, это тоже нулевое значение. – vic

8

Это было исправлено в новой версии spring-social-facebook. Пожалуйста, добавьте следующую строку в ваш pom.xml

<dependency> 
    <groupId>org.springframework.social</groupId> 
    <artifactId>spring-social-facebook</artifactId> 
    <version>3.0.0.M1</version> 
</dependency> 

Если вы получаете сообщение об ошибке, что эта версия не доступна, добавьте следующие строки, а также.

<repositories> 
    <repository> 
     <id>alfresco-public</id> 
     <url>https://artifacts.alfresco.com/nexus/content/groups/public</url> 
    </repository> 
</repositories> 
+0

Спасибо за это ... Как насчет событий? Будете ли вы иметь какие-либо знания. org.springframework.social.UncategorizedApiException: (# 12) is_date_only поле устарело для версий v2.4 и выше] –

+0

Это больше не работает для меня. Мне пришлось использовать репозиторий весеннего веха: –

+0

См. Это сообщение для дополнительных зависимостей, необходимых для получения ConnectionRepository снова с 3.0.0.M1 http://stackoverflow.com/a/42175408/1410212 – lilalinux

1

Под Граалей весной фейсбук безопасности У меня была аналогичная проблема и благодаря @ user6904265 мне удалось получить его работу:

//This was provided example method: 
//org.springframework.social.facebook.api.User fbProfile = facebook.userOperations().userProfile 
//This is the groovy way of declaring fields: 
String[] fields = ['id',"email", "age_range", "birthday","first_name", 
        "last_name","gender"] as String[] 
//This bit pay attention to the User.class segment. 
org.springframework.social.facebook.api.User fbProfile = 
facebook.fetchObject("me", 
org.springframework.social.facebook.api.User.class, fields) 

В основном по умолчанию при условии, вышеприведенный пример состояний User.class. Локальному запуску не удалось найти такие поля, как last_name и т. Д., И дал список, который он мог запросить. Те, которые были предоставлены, были из фактического класса User Security (по умолчанию для моего приложения), чтобы вы также искали правильные классы пользователей.

0
FacebookTemplate template = new FacebookTemplate(access_token); 
String [] fields = { "id", "email", "first_name", "last_name" }; 
User profile = template.fetchObject("me", User.class, fields); 
1

У меня были проблемы с новой версией spring-social-facebook. Чтобы исправить это, используйте версию 2.0.3.RELEASE вставьте следующий код в свой SocialService.Java

@PostConstruct 
private void init() { 
    try { 
     String[] fieldsToMap = { 
      "id", "about", "age_range", "birthday", "context", "cover", "currency", "devices", "education", "email", "favorite_athletes", "favorite_teams", "first_name", "gender", "hometown", "inspirational_people", "installed", "install_type","is_verified", "languages", "last_name", "link", "locale", "location", "meeting_for", "middle_name", "name", "name_format","political", "quotes", "payment_pricepoints", "relationship_status", "religion", "security_settings", "significant_other","sports", "test_group", "timezone", "third_party_id", "updated_time", "verified", "viewer_can_send_gift","website", "work" 
     }; 

     Field field = Class.forName("org.springframework.social.facebook.api.UserOperations"). 
       getDeclaredField("PROFILE_FIELDS"); 
     field.setAccessible(true); 

     Field modifiers = field.getClass().getDeclaredField("modifiers"); 
     modifiers.setAccessible(true); 
     modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL); 
     field.set(null, fieldsToMap); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

Этот код не будет пытаться получить био поле из Facebook.

Вы можете посмотреть более подробную информацию здесь: https://github.com/jhipster/generator-jhipster/issues/2349

+0

Супер! Это прекрасно работает. И я думаю, что это должен быть подходящий ответ на этот вопрос, так как это не только устраняет проблему только для одного сценария 'facebook.userOperations(). GetUserProfile()', но все остальные проблемы из-за того, что поле 'bio' прекращено. Спасибо за решение! – iamharish15