Ich habe Version 2.0.3.RELEASE von spring-social-facebook und Facebook-App api v2.8 verwendet .. Ich habe Facebook-Login angerufen, aber diese Nachricht zurückgegeben .. (# 12). 8 und höher " Wie kann ich das beheben?
Ich habe den gleichen Fehler erhalten, 2.0.3.RELEASE von spring-social-facebook scheint mit der API-Version 2.8 von API (gestern veröffentlicht) nicht kompatibel zu sein. Lesen von Facebook-Änderungsprotokoll für die Version 2.8 ( https://developers.facebook.com/docs/apps/changelog ):
User Bios - Das Biofeld im User-Objekt ist nicht mehr verfügbar. Wenn das Biofeld für eine Person festgelegt wurde, wird der Wert jetzt an das About-Feld angehängt.
Ich denke, wir müssen auf eine neue Version der Bibliothek von spring-social-facebook warten. In der Version 2.0.3 (im Interface org.springframework.social.facebook.api.UserOperations) befindet sich in der Konstanten PROFILE_FIELDS das Feld "bio", das in der Facebook API-Version v2.8 nicht unterstützt wird.
UPDATE: Ich habe in meinem Fall einen Workaround gefunden:
VOR:
Connection<Facebook> connection = facebookConnectionFactory.createConnection(accessGrant);
Facebook facebook = connection.getApi();
User userProfile = facebook.userOperations().getUserProfile();//raises the exception caused by the "bio" field.
NACH DEM
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);
Hier eine vollständige Liste der Felder, die Sie verwenden könnten:
{ "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"}
Problemumgehung für JHipster . Fügen Sie der SocialService
-Klasse das folgende Snippet hinzu, bis spring-social-facebook
behoben ist.
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();
}
}
Quelle: https://github.com/jhipster/generator-jhipster/issues/2349 - minus bio
im fieldsToMap
-Array.
Dies wurde in der neuen Version von spring-social-facebook behoben. Fügen Sie Ihrer pom.xml bitte folgendes hinzu
<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-facebook</artifactId>
<version>3.0.0.M1</version>
</dependency>
Wenn Sie die Fehlermeldung erhalten, dass diese Version nicht verfügbar ist, fügen Sie auch Folgendes hinzu.
<repositories>
<repository>
<id>alfresco-public</id>
<url>https://artifacts.alfresco.com/nexus/content/groups/public</url>
</repository>
</repositories>
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";
}
}
Ich hatte Probleme mit der neuen Version von spring-social-facebook. Um dies mit Version 2.0.3.RELEASE zu beheben, fügen Sie den folgenden Code in Ihre SocialService.Java ein.
@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();
}
}
Dieser Code versucht nicht, das bio -Feld von Facebook abzurufen.
Weitere Details finden Sie hier: https://github.com/jhipster/generator-jhipster/issues/2349
Ich hatte unter grails spring security facebook ein ähnliches Problem und dank @ user6904265 habe ich es geschafft, es zum Laufen zu bringen:
//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)
Grundsätzlich lautet das oben angegebene Standardbeispiel User.class
. Diese lokale Ausführung konnte Felder wie Nachname usw. nicht finden und gab eine Liste an, die abgefragt werden konnte. Diese Optionen stammen aus der eigentlichen Spring Security-Benutzerklasse (Standardeinstellung für meine App). Stellen Sie also sicher, dass Sie auch die richtigen Benutzerklassen suchen.
FacebookTemplate template = new FacebookTemplate(access_token);
String [] fields = { "id", "email", "first_name", "last_name" };
User profile = template.fetchObject("me", User.class, fields);
entferne den Parameter -> "Bio" von deiner API-Aufruf-URL, für mich ist es gelöst
nach dem
Ich habe die Schnittstelle UserOperations in meinem Projekt geändert PROFILE_FIELDS Entfernen Bio Feld kopiert. Auf Tomcat hat meine bearbeitete Klasse Vorrang vor der Schnittstelle org.springframework.social.facebook.api.UserOperations, wodurch das Problem behoben wird. (siehe letzte Zeilen der Datei unten)
/*
* 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"
};
}