Error message is (#12) bio field is deprecated for versions v2.8 and higher

后端 未结 9 1280
南旧
南旧 2020-12-01 09:31

I used version 2.0.3.RELEASE of spring-social-facebook and Facebook app api v2.8. I called Facebook login but returned this message. \"(#12) bio field is deprecated for vers

相关标签:
9条回答
  • 2020-12-01 09:40

    This has been fixed in new release of spring-social-facebook. Please add the following to your pom.xml

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

    If you get error that this version is not available, add the following as well.

    <repositories>
        <repository>
            <id>alfresco-public</id>
            <url>https://artifacts.alfresco.com/nexus/content/groups/public</url>
        </repository>
    </repositories>
    
    0 讨论(0)
  • 2020-12-01 09:44

    I had problems with the new version of spring-social-facebook. To fix this using version 2.0.3.RELEASE paste the following code in your 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();
        }
    }
    

    This code will not try to retrieve bio field from Facebook.

    You can see more details here: https://github.com/jhipster/generator-jhipster/issues/2349

    0 讨论(0)
  • 2020-12-01 09:48

    I copied interface UserOperations in my project changing PROFILE_FIELDS removing bio field. On Tomcat, my edited class takes priority over org.springframework.social.facebook.api.UserOperations interface and this fix the problem. (see last rows of below file)

    /*
     * Copyright 2015 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package org.springframework.social.facebook.api;
    
    import java.util.List;
    
    import org.springframework.social.ApiException;
    import org.springframework.social.MissingAuthorizationException;
    public interface UserOperations {
    
    /**
     * Retrieves the profile for the authenticated user.
     * @return the user's profile information.
     * @throws ApiException if there is an error while communicating with Facebook.
     * @throws MissingAuthorizationException if FacebookTemplate was not created with an access token.
     */
    User getUserProfile();
    
    /**
     * Retrieves the profile for the specified user.
     * @param userId the Facebook user ID to retrieve profile data for.
     * @return the user's profile information.
     * @throws ApiException if there is an error while communicating with Facebook.
     */
    User getUserProfile(String userId);
    
    /**
     * Retrieves the user's profile image. Returns the image in Facebook's "normal" type.
     * @return an array of bytes containing the user's profile image.
     * @throws ApiException if there is an error while communicating with Facebook.
     * @throws MissingAuthorizationException if FacebookTemplate was not created with an access token.
     */
    byte[] getUserProfileImage();
    
    /**
     * Retrieves the user's profile image. Returns the image in Facebook's "normal" type.
     * @param userId the Facebook user ID.
     * @return an array of bytes containing the user's profile image.
     * @throws ApiException if there is an error while communicating with Facebook.
     */
    byte[] getUserProfileImage(String userId);
    
    /**
     * Retrieves the user's profile image.
     * @param imageType the image type (eg., small, normal, large. square)
     * @return an array of bytes containing the user's profile image.
     * @throws ApiException if there is an error while communicating with Facebook.
     * @throws MissingAuthorizationException if FacebookTemplate was not created with an access token.
     */
    byte[] getUserProfileImage(ImageType imageType);
    
    /**
     * Retrieves the user's profile image.
     * @param userId the Facebook user ID.
     * @param imageType the image type (eg., small, normal, large. square)
     * @return an array of bytes containing the user's profile image.
     * @throws ApiException if there is an error while communicating with Facebook.
     */
    byte[] getUserProfileImage(String userId, ImageType imageType);
    
    /**
     * Retrieves the user's profile image. When height and width are both used,
     * the image will be scaled as close to the dimensions as possible and then
     * cropped down.
     * @param width the desired image width
     * @param height the desired image height
     * @return an array of bytes containing the user's profile image.
     * @throws ApiException if there is an error while communicating with Facebook.
     */
    byte[] getUserProfileImage(Integer width, Integer height);
    
    /**
     * Retrieves the user's profile image. When height and width are both used,
     * the image will be scaled as close to the dimensions as possible and then
     * cropped down.
     * @param userId the Facebook user ID.
     * @param width the desired image width
     * @param height the desired image height
     * @return an array of bytes containing the user's profile image.
     * @throws ApiException if there is an error while communicating with Facebook.
     */
    byte[] getUserProfileImage(String userId, Integer width, Integer height);
    
    /**
     * Retrieves a list of permissions that the application has been granted for the authenticated user.
     * @return the permissions granted for the user.
     * @throws ApiException if there is an error while communicating with Facebook.
     * @throws MissingAuthorizationException if FacebookTemplate was not created with an access token.
     */
    List<Permission> getUserPermissions();
    
    /**
     * Fetches IDs that the user has on any applications associated with the calling application via Facebook's Business Mapping API.
     * @return a list of ID-to-application mapping that the user has on related applications.
     */
    List<UserIdForApp> getIdsForBusiness();
    
    /**
     * Fetches a list of places that the user has checked into or has been tagged at.
     * @return a list of place tags for the user.
     */
    List<PlaceTag> getTaggedPlaces();
    
    /**
     * Searches for users.
     * @param query the search query (e.g., "Michael Scott")
     * @return a list of {@link Reference}s, each representing a user who matched the given query.
     * @throws ApiException if there is an error while communicating with Facebook.
     * @throws MissingAuthorizationException if FacebookTemplate was not created with an access token.
     */
    PagedList<Reference> search(String query);
    
    static final String[] PROFILE_FIELDS = {
        "id", "about", "age_range",/*"bio",*/ "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 讨论(0)
  • 2020-12-01 09:52

    Workaround for JHipster. Add the following snippet into your SocialService class until spring-social-facebook is fixed.

    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 - minus bio in fieldsToMap array.

    0 讨论(0)
  • 2020-12-01 09:52

    Under grails spring security facebook I had a similar issue and thanks to @user6904265 I have managed to get it working:

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

    Basically the default provided example above states User.class. This running locally was unable to find fields such as last_name etc and gave a list it could query. Those provided options were from the actual spring security User class (default to my app) so ensure you also look up correct user classes.

    0 讨论(0)
  • 2020-12-01 09:54

    I got the same error, 2.0.3.RELEASE of spring-social-facebook seems to be not compatible with v2.8 Facebook API version (released yesterday). Reading from facebook changelog for the v2.8 (https://developers.facebook.com/docs/apps/changelog):

    User Bios - The bio field on the User object is no longer available. If the bio field was set for a person, the value will now be appended to the about field.

    I think we have to wait a new release of spring-social-facebook library. In the release 2.0.3 (in the interface org.springframework.social.facebook.api.UserOperations) there is the "bio" field in the PROFILE_FIELDS constant and it is not supported in the v2.8 facebook API version.

    UPDATE: I found a workaround in my case:

    BEFORE:

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

    AFTER

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

    Here a complete list of field you could use:

    { "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 讨论(0)
提交回复
热议问题