2015-10-10 1 views
2

Я разработал простое веб-приложение, которое обращается к данным Facebook через Spring Boot (v1.2.6.RELEASE) и Spring Social Facebook (v2 .0.2.RELEASE), аналогично приведенному примеру hereSpring Social Facebook UncategorizedApiException: (# 3) Приложение не имеет возможности сделать этот вызов API

Я создал новое приложение в Facebook, которое использует Graph API версии 2.5.

Согласно этому примеру я модифицированный facebookConnect.html положить эту другую область, чтобы запрос метода POST:

<html> 
<head> 
    <title>Facebook Extractor</title> 
</head> 
<body> 
    <h3>Connect to Facebook</h3> 

    <form action="/recommender/connect/facebook" method="POST"> 
     <input type="hidden" name="scope" value="public_profile, user_friends, email, user_likes" /> 
     <div class="formInfo"> 
      <p>You aren't connected to Facebook yet. Click the button to connect this application with your Facebook account.</p> 
     </div> 
     <p><button type="submit">Connect to Facebook</button></p> 
    </form> 
</body> 

обрабатывается ConnectController, который стартует поток авторизации OAuth коды ...

После успешного завершения OAuth (с предоставлением разрешения), я получаю следующее сообщение об ошибке:

(#3) application does not have the capability to make this api call.

Здесь основная часть контроллера, который обрабатывать перенаправление с использованием Facebook App:

@Controller 

@Scope (значение = "сеанса") общественного класса FacebookExtractor {

private Logger logger = Logger.getLogger(FacebookExtractor.class); 

private Facebook facebook; 
@Autowired 
GraphDatabase graphDatabase; 
@Autowired 
PersonRepository personRepository; 
@Autowired 
UserProfileRepository userProfileRepository; 
@Autowired 
AttributeDefinitionRepository attributeDefinitionRepository; 
@Autowired 
AttributeRepository attributeRepository; 
@Autowired 
ConceptRepository conceptRepository; 
@Autowired 
RecommenderGovConsumerRepository recGovRepository; 
@Autowired 
GovConsumerInfluencedByGovConsumerRelationshipRepository influenceRepository; 
@Autowired 
ExtractorListener listener; 

private String userBind; 

@Inject 
public FacebookExtractor(Facebook facebook) { 
    this.facebook = facebook; 
} 

@RequestMapping(method = RequestMethod.GET, value = "/facebookExtractor") 
public ModelAndView FacebookDataUserExtraction() { 
    if (!facebook.isAuthorized()) { 
     return new ModelAndView("redirect:/recommender/connect/facebook"); 
    } 
    String account=userBind; 
    Long netId = null; 
    Transaction tx = graphDatabase.beginTx(); 
    try { 
     User user = facebook.userOperations().getUserProfile(); 
     Person p = savePerson(user); 
     UserProfile up = saveUserProfile(user); 
     up.setUser(p); 
     userProfileRepository.save(up); 
     p.setProfile(up); 
     saveSocialInteractions(up); 
     saveSocialPreferences(up); 
     personRepository.save(p); 
     netId=p.getId(); 
     tx.success(); 
    } finally { 
     tx.close(); 
    } 
    if (account != null) { 
     /* 
     * Binding di Facebook riuscito. 
     */ 
     listener.onProfileDataCompleted(netId, SNAccountType.Facebook); 
     listener.onInteractionsCompleted(netId, InteractionType.Friendship, SNAccountType.Facebook); 
     return new ModelAndView("redirect:http://localhost:8080/portal", 
       "accountF", account); 
    } else { 
     //vista opportuna per estrazione avvenuta senza bind 
     return new ModelAndView("facebookNoBindExtraction"); 
    } 
} 

Наблюдая стек ошибка отслеживания, кажется, я получаю ошибку на этой линии в контроллере:

User user = facebook.userOperations().getUserProfile();

, но это странно, потому что у меня должно быть разрешение на получение базовых данных профиля пользователя по умолчанию.

Примечание: тот же код со старым приложением в Facebook, который использует Graph API версии 2.3, отлично работает, но мне нужен новый для разных целей и не могу заставить новое приложение в Facebook использовать эту версию .. .

Здесь ошибка стека я получаю ....

12:01:16.953 [http-nio-9080-exec-5] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.social.UncategorizedApiException: (#3) Application does not have the capability to make this API call.] with root cause org.springframework.social.UncategorizedApiException: (#3) Application does not have the capability to make this API call. at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleFacebookError(FacebookErrorHandler.java:91) ~[spring-social-facebook-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleError(FacebookErrorHandler.java:59) ~[spring-social-facebook-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:614) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:570) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:545) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:253) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:214) ~[spring-social-facebook-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:209) ~[spring-social-facebook-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.social.facebook.api.impl.UserTemplate.getUserProfile(UserTemplate.java:53) ~[spring-social-facebook-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.social.facebook.api.impl.UserTemplate.getUserProfile(UserTemplate.java:49) ~[spring-social-facebook-2.0.2.RELEASE.jar:2.0.2.RELEASE] at it.cerict.recommender.extractor.controllers.FacebookExtractor.FacebookDataUserExtraction(FacebookExtractor.java:89) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_60] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_60] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_60] at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_60] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.0.26.jar:8.0.26] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at it.cerict.recommender.config.CORSFilter.doFilter(CORSFilter.java:22) ~[classes/:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) ~[tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1526) [tomcat-embed-core-8.0.26.jar:8.0.26] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1482) [tomcat-embed-core-8.0.26.jar:8.0.26] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_60] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_60] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.0.26.jar:8.0.26] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]

ответ

3

проблема с PROFILE_FILEDS в

public User getUserProfile(String facebookId) { 
    return graphApi.fetchObject(facebookId, User.class, PROFILE_FIELDS); 
} 

Array PROFILE_FIELDS содержит много полей, и, поскольку я правильно понял весенние социальные документы, Facebook вернул только те поля, которые у вас есть для просмотра. Но сейчас что-то изменилось:

$curl "https://graph.facebook.com/v2.5/me?access_token=[access_tokens]&fields=[all_the_fields_from_PROFILE_FIELDS] 
{"error":{"message":"(#3) Application does not have the capability to make this API call.","type":"OAuthException","code":3,"fbtrace_id":"Antivssjj1d"}} 

$ curl "https://graph.facebook.com/v2.3/me?access_token=[access_token]&fields=id,about" 
{"id":"1135898619755433"} 

В то же время я нашел гуманного.Вместо

User profile = facebook.userOperations().getUserProfile() 

мы можем использовать

User profile = facebook.fetchObject("me", User.class, "id", "name", "link", "email"); 

//Note: facebook = org.springframework.social.facebook.api.Facebook 
//Note: User.class = org.springframework.social.facebook.api.User.class 
+0

facebook = org.springframework.social.facebook.api.Facebook и User.class = org.springframework.social.facebook.api.User.class – Selwyn

0

Или ждать обновление весенне-социальной-Facebook, есть запрос тянуть очереди на хранилище: https://github.com/spring-projects/spring-social-facebook/pull/171

UPDATE: Fix для меня с версией 2.0.3.RELEASE.

+0

Я скомпилировал последний код, но все же такое же исключение существует. –

+1

К сожалению, они до сих пор не сливают запрос на тяну, поэтому он не работает. Я не знаю, когда они выпустят новый релиз. Просто подожди :( –

0

Я продолжал получать эту ошибку, даже после добавления области publish_actions, которая требуется моему приложению. Проблема в моем случае состояла в том, что мне понадобилось Facebook для просмотра моего приложения. Это тот случай, если ваше приложение было создано после того, как 30 апреля 2014 года, и один или более из следующих условий:

  • Вы хотите, чтобы ваше приложение должны быть перечислены в Facebook App Center
  • Вы хотите создать новый или редактировать существующие, открытые действия Graph и рассказы
  • Вашего приложение просит человек для каких-либо расширенных прав доступа, включая publish_actions

Посмотрите на Facebook Login Review FAQs для получения дополнительной информации о процессе обзора.