2

我正在尝试使用 Spring Social Facebook 来阅读我的应用程序(目前是一个简单的 Java 类测试)

但我遇到了一些问题。我创建了一个非常简单的项目(面向 maven),我正在使用 Spring social 1.1.0

我创建了以下 Java 类:

import it.eng.comi.spring.service.CoMiSocialNetworkingSvc;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.social.connect.support.ConnectionFactoryRegistry;
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.impl.FacebookTemplate;
import org.springframework.social.facebook.connect.FacebookConnectionFactory;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.social.oauth2.OAuth2Operations;
import org.springframework.social.twitter.api.Tweet;
import org.springframework.social.twitter.api.Twitter;
import org.springframework.social.twitter.api.impl.TwitterTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

@Service
public class CoMiSocialNetworkSvcImpl implements CoMiSocialNetworkingSvc
{
    private static final Log logger = LogFactory.getLog(CoMiSocialNetworkSvcImpl.class.getName());
    @Value("${facebook.appId}")
    private String facebookAppId;
    @Value("${facebook.appSecret}")
    private String facebookAppSecret;
    @Value("${facebook.appNamespace}")
    private String facebookAppNamespace;
    @Autowired
    private ConnectionFactoryRegistry cfr;

    @Override
    public PagedList<Post> getPosts() throws Exception
    {

        try
        {

            FacebookConnectionFactory fcc = (FacebookConnectionFactory)cfr.getConnectionFactory("facebook");
            OAuth2Operations oauthOper = fcc.getOAuthOperations();
            String scope = "publish_stream,offline_access,read_stream,user_about_me,manage_pages";
            AccessGrant ag = oauthOper.authenticateClient(scope);
            String accessToken = ag.getAccessToken();
            logger.info("Access Token: "+accessToken);
            Facebook facebook = new FacebookTemplate(accessToken);
            PagedList<Post> result = facebook.feedOperations().getHomeFeed();
            result.addAll(facebook.feedOperations().getFeed());
            return result;
        }
        catch (Exception e)
        {
            String messagge = "Errore nel recupero feed: "+e.getMessage();
            logger.fatal(messagge, e);
            throw e;
        }
    }
}

我创建了这个简单的 JUnit 测试:

import java.util.List;
import it.eng.comi.spring.service.CoMiSocialNetworkingSvc;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.social.facebook.api.PagedList;
import org.springframework.social.facebook.api.Post;
import org.springframework.social.twitter.api.Tweet;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

@ContextConfiguration(value={
        "classpath:application-context-social.xml"
})

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class ComiSocialTests
{
    private static final Log logger = LogFactory.getLog(ComiSocialTests.class.getName());
    @Autowired
    private CoMiSocialNetworkingSvc social;
    @Test
    public void testFeeds()
    {
        try
        {
            PagedList<Post> feeds = social.getPosts();
            for (Post post : feeds)
            {
                logger.info("Caption "+post.getCaption()+" like counts "+post.getLikeCount()+" comments count: "+post.getCommentCount()+" descrizione "+post.getDescription());
            }
        }
        catch (Exception e)
        {
            logger.error(e.getMessage(), e);
        }
    }   
}

这是我的应用程序上下文 XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:facebook="http://www.springframework.org/schema/social/facebook"
    xmlns:twitter="http://www.springframework.org/schema/social/twitter"
    xmlns:social="http://www.springframework.org/schema/social"
    xmlns:linkedin="http://www.springframework.org/schema/social/linkedin"
    xmlns:c="http://www.springframework.org/schema/c"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/social/facebook http://www.springframework.org/schema/social/spring-social-facebook.xsd
        http://www.springframework.org/schema/social/linkedin http://www.springframework.org/schema/social/spring-social-linkedin.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/social/twitter http://www.springframework.org/schema/social/spring-social-twitter.xsd
        http://www.springframework.org/schema/social http://www.springframework.org/schema/social/spring-social.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    <context:property-placeholder location="classpath:configuration.properties" ignore-resource-not-found="true" ignore-unresolvable="true" />
    <context:component-scan base-package="it.eng.comi.spring" />
    <bean id="connectionFactoryLocator"
        class="org.springframework.social.connect.support.ConnectionFactoryRegistry">
        <property name="connectionFactories">
            <list>
                <bean
                    class="org.springframework.social.facebook.connect.FacebookConnectionFactory">
                    <constructor-arg value="${facebook.appId}" />
                    <constructor-arg value="${facebook.appSecret}" />
                </bean>
                <bean
                    class="org.springframework.social.twitter.connect.TwitterConnectionFactory">
                    <constructor-arg value="${twitter.appKey}" />
                    <constructor-arg value="${twitter.appSecret}" />
                </bean>
            </list>
        </property>
    </bean>
</beans>

当我尝试使用显示的实现(显示类的方法 getPosts())与 FB 联系时,我收到此错误:

11:35:39,501 INFO  [CoMiSocialNetworkSvcImpl] Access Token: 868557579830099|4JH01Jwud-Ot0UTd_FoF_439r50
11:35:45,149 WARN  [RestTemplate] GET request for "https://graph.facebook.com/me/home?limit=25" resulted in 400 (Bad Request); invoking error handler
{"error":{"message":"An active access token must be used to query information about the current user.","type":"OAuthException","code":2500}}
11:35:50,625 FATAL [CoMiSocialNetworkSvcImpl] Errore nel recupero feed: Authorization is required for the operation, but the API binding was created without authorization.
org.springframework.social.MissingAuthorizationException: Authorization is required for the operation, but the API binding was created without authorization.
    at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleFacebookError(FacebookErrorHandler.java:89)
    at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleError(FacebookErrorHandler.java:65)
    at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:588)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:546)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:517)
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:255)
    at org.springframework.social.facebook.api.impl.FeedTemplate.fetchConnectionList(FeedTemplate.java:367)
    at org.springframework.social.facebook.api.impl.FeedTemplate.getHomeFeed(FeedTemplate.java:106)
    at org.springframework.social.facebook.api.impl.FeedTemplate.getHomeFeed(FeedTemplate.java:95)
    at it.eng.comi.spring.service.impl.CoMiSocialNetworkSvcImpl.getPosts(CoMiSocialNetworkSvcImpl.java:146)
    at it.eng.comi.test.ComiSocialTests.testFeeds(ComiSocialTests.java:52)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)

谁能建议我如何解决这个问题?我被困在这几天了,我无法解决它

谢谢安吉洛

4

0 回答 0