spring social facebook - example - El mensaje de error es(# 12) el campo bio está en desuso para las versiones v2.8 y superiores
spring social security (9)
Utilicé la versión 2.0.3.RELEASE de la aplicación spring-social-facebook y Facebook api v2.8. Llamé al inicio de sesión de Facebook pero devolví este mensaje. "(# 12) el campo bio está en desuso para las versiones v2.8 y superiores" ¿Cómo puedo solucionar esto?
Copié la interfaz UserOperations en mi proyecto cambiando PROFILE_FIELDS eliminando el campo bio . En Tomcat, mi clase editada tiene prioridad sobre la interfaz org.springframework.social.facebook.api.UserOperations y esto soluciona el problema. (vea las últimas filas del archivo a continuación)
/*
* 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"
};
}
En Facebook de seguridad de primavera de Grails tuve un problema similar y gracias a @ user6904265 he logrado que funcione:
//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)
Básicamente, el ejemplo proporcionado por defecto anterior establece
User.class
.
Esta ejecución local no pudo encontrar campos como last_name, etc. y proporcionó una lista que podría consultar.
Las opciones proporcionadas provienen de la clase de usuario de Spring Spring Security (predeterminada para mi aplicación), así que asegúrese de buscar también las clases de usuario correctas.
Esto se ha solucionado en la nueva versión de spring-social-facebook. Agregue lo siguiente a su pom.xml
<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-facebook</artifactId>
<version>3.0.0.M1</version>
</dependency>
Si recibe el error de que esta versión no está disponible, agregue también lo siguiente.
<repositories>
<repository>
<id>alfresco-public</id>
<url>https://artifacts.alfresco.com/nexus/content/groups/public</url>
</repository>
</repositories>
Obtuve el mismo error, 2.0.3. RELEASE de spring-social-facebook parece no ser compatible con la versión v2.8 de la API de Facebook (publicada ayer). Lectura del registro de cambios de Facebook para v2.8 ( https://developers.facebook.com/docs/apps/changelog ):
Biografías del usuario: el campo bio del objeto Usuario ya no está disponible. Si el campo bio se estableció para una persona, el valor ahora se agregará al campo Acerca de.
Creo que tenemos que esperar un nuevo lanzamiento de la biblioteca spring-social-facebook. En la versión 2.0.3 (en la interfaz org.springframework.social.facebook.api.UserOperations) existe el campo "bio" en la constante PROFILE_FIELDS y no es compatible con la versión v2.8 API de Facebook.
ACTUALIZACIÓN: Encontré una solución en mi caso:
ANTES DE:
Connection<Facebook> connection = facebookConnectionFactory.createConnection(accessGrant);
Facebook facebook = connection.getApi();
User userProfile = facebook.userOperations().getUserProfile();//raises the exception caused by the "bio" field.
DESPUÉ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);
Aquí una lista completa de los campos que puede usar:
{ "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"}
Solución para
JHipster
.
Agregue el siguiente fragmento a su clase de
SocialService
hasta que se
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();
}
}
Fuente:
https://github.com/jhipster/generator-jhipster/issues/2349
- menos
bio
en la matriz
fieldsToMap
.
Tuve problemas con la nueva versión de spring-social-facebook. Para arreglar esto usando la versión 2.0.3. RELEASE pegue el siguiente código en su 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();
}
}
Este código no intentará recuperar el campo bio de Facebook.
Puede ver más detalles aquí: https://github.com/jhipster/generator-jhipster/issues/2349
elimine el parámetro -> "bio" de su url de llamada de API, para mí lo resolvió
después
FacebookTemplate template = new FacebookTemplate(access_token);
String [] fields = { "id", "email", "first_name", "last_name" };
User profile = template.fetchObject("me", User.class, fields);
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";
}
}