32 votes

Le message d'erreur est (#12) bio field is deprecated for versions v2.8 and higher

J'ai utilisé la version 2.0.3.RELEASE de spring-social-facebook et l'api Facebook v2.8. J'ai appelé le login Facebook mais j'ai reçu ce message. "(#12) bio field is deprecated for versions v2.8 and higher" Comment puis-je résoudre ce problème ?

0 votes

Il y a un PR en attente de fusion pour corriger ce problème : github.com/spring-projects/spring-social-facebook/pull/218

0 votes

Une idée de la date à laquelle la réparation sera effectuée ? Il est toujours bloqué à la version 2.0.3.

0 votes

Le PR a été fusionné. Il y a le v3.0.0.M1 disponible dès maintenant.

54voto

user6904265 Points 1734

J'ai obtenu la même erreur, 2.0.3.RELEASE de spring-social-facebook semble ne pas être compatible avec la version v2.8 de l'API Facebook (publiée hier). En lisant le changelog de facebook pour la v2.8 ( https://developers.facebook.com/docs/apps/changelog ):

Bios de l'utilisateur - Le champ bio de l'objet Utilisateur n'est plus disponible. Si le champ "bio" a été défini pour une personne, la valeur sera désormais ajoutée au champ "à propos".

Je pense que nous devons attendre une nouvelle version de la bibliothèque spring-social-facebook. Dans la version 2.0.3 (dans l'interface org.springframework.social.facebook.api.UserOperations) il y a le champ "bio" dans la constante PROFILE_FIELDS et il n'est pas supporté dans la version v2.8 de l'API facebook.

MISE À JOUR : j'ai trouvé une solution dans mon cas :

AVANT :

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

APRÈS

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

Voici une liste complète des champs que vous pouvez utiliser :

{ "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 votes

J'obtiens l'erreur suivante pour ce qui précède, des suggestions ? {"errors" :["com.fasterxml.jackson.databind.JsonMappingException", "Impossible de construire une instance de org.springframework.social.connect.UserProfile : aucun constructeur approprié n'a été trouvé, impossible de désérialiser à partir d'une valeur Object (constructeur ou créateur par défaut manquant, ou peut-être faut-il ajouter/activer des informations sur le type ?) \n at [Source : java.io.ByteArrayInputStream@fa18e2e ; line : 1, column : 2]"]}.

0 votes

Cette solution remplace avantageusement facebook.userOperations().getUserProfile() sans aucun paramètre. Mais comment faire la même chose lorsque nous voulons récupérer l'objet utilisateur pour un autre identifiant de profil ? Par exemple, comment faire la même chose pour facebook.userOperations().getUserProfile("some_facebook_id_h‌​ere")

0 votes

Véase stackoverflow.com/a/44872810/2015311 pour une autre approche de cette question qui fonctionnera dans tous les scénarios.

29voto

Michal Foksa Points 3455

Solution de contournement pour JHipster . Ajoutez l'extrait suivant dans votre SocialService jusqu'à ce que spring-social-facebook est fixé.

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();
    }
}

Source : https://github.com/jhipster/generator-jhipster/issues/2349 - moins bio en fieldsToMap de la gamme.

0 votes

On dirait que mon code est copié partout sur internet :) stackoverflow.com/a/34133450/1943228

11voto

Mr. White Points 82

Ce problème a été corrigé dans la nouvelle version de spring-social-facebook. Veuillez ajouter ce qui suit à votre pom.xml

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

Si vous obtenez une erreur indiquant que cette version n'est pas disponible, ajoutez également ce qui suit.

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

0 votes

Merci pour cette information... Qu'en est-il des opérations événementielles ? Vous avez des connaissances. org.springframework.social.UncategorizedApiException : (#12) is_date_only field is deprecated for versions v2.4 and higher]

0 votes

Cela ne fonctionne plus pour moi. J'ai dû utiliser le référentiel spring milestone :

1 votes

Voir cet article pour les dépendances supplémentaires nécessaires pour récupérer ConnectionRepository avec la version 3.0.0.M1. stackoverflow.com/a/42175408/1410212

8voto

Vasundhara Points 82
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 votes

Comment avez-vous récupéré ces données de terrain ? Je ne peux obtenir que le nom, le prénom et le nom de famille, tout le reste est nul. J'ai surtout besoin de récupérer les données relatives aux amis. Elles sont donc également nulles.

5voto

joalcego Points 606

J'ai eu des problèmes avec la nouvelle version de spring-social-facebook. Pour corriger ce problème en utilisant la version 2.0.3.RELEASE, collez le code suivant dans votre fichier 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();
    }
}

Ce code n'essaiera pas de récupérer bio champ de Facebook.

Vous trouverez plus de détails ici : https://github.com/jhipster/generator-jhipster/issues/2349

0 votes

Super ! Cela fonctionne parfaitement. Et je pense que cela devrait être la réponse appropriée à cette question car cela ne corrige pas seulement le problème pour un seul scénario de facebook.userOperations().getUserProfile() mais toutes les autres questions liées à la bio en cours d'abandon. Merci pour la solution !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X