【问题标题】:Quartz Job can't call facebook Service ( Spring Social )Quartz Job 无法调用 facebook 服务(Spring Social)
【发布时间】:2015-07-27 18:06:56
【问题描述】:

我正在尝试通过我的 Quartz Job 调用 facebook API 以自动获取朋友、帖子或新订阅源……但我无法通过 Job 运行。我认为我在 SocialConfig 上错了。 当我从控制器调用 facebookService 时,它​​可以正常工作。 你能帮我解决这个问题吗。非常感谢。

社交配置

public class SocialConfig {
@Value("${facebook.clientId}")
private String facebookClientId;

@Value("${facebook.clientSecret}")
private String facebookClientSecret;

@Inject
private DataSource dataSource;
@Bean
public ConnectionFactoryLocator connectionFactoryLocator() {
    ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
    registry.addConnectionFactory(new FacebookConnectionFactory(facebookClientId, facebookClientSecret));
    return registry;
}

@Bean
public UsersConnectionRepository usersConnectionRepository() {
    JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(dataSource,
            connectionFactoryLocator(), Encryptors.noOpText());
    repository.setConnectionSignUp(new SimpleConnectionSignUp());
    return repository;
}
@Bean
@Scope(value="request", proxyMode=ScopedProxyMode.NO)
public ConnectionRepository connectionRepository() {
    User user = SecurityContext.getCurrentUser();
    return usersConnectionRepository().createConnectionRepository(user.getId());
}

@Bean
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS) 
public Facebook facebook() {
    return connectionRepository().getPrimaryConnection(Facebook.class).getApi();
}

遇到错误

org.springframework.beans.factory.BeanCreationException:创建名为“scopedTarget.facebook”的bean时出错:当前线程的范围“会话”不活动;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException:未找到线程绑定请求:您是指实际 Web 请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上是在 Web 请求中操作并且仍然收到此消息,则您的代码可能在 DispatcherServlet/DispatcherPortlet 之外运行:在这种情况下,请使用 RequestContextListener 或 RequestContextFilter 来公开当前请求。

我已经通过添加 web.xml 尝试了 RequestContextListener,但它不起作用。

工作调用

@Override
protected void executeInternal(JobExecutionContext context)
        throws JobExecutionException {
    try {
        ApplicationContextProvider appContext = new ApplicationContextProvider();
        FacebookService facebookService = appContext.getApplicationContext().getBean("facebookService", FacebookService.class);
      //##It shows error here##
        System.out.println("!!User: "+facebookService.getFacebookFriends().get(0).getName());
        //runMeTask.printMe();
        System.out.println("!!*****Quartz*****!!");
    } catch (Exception ex) {
        System.out.println(ex);
    }
}

Facebook 服务

public class FacebookService {
private Facebook facebook;

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

public Facebook getFacebook() {
    return facebook;
}

public void setFacebook(Facebook facebook) {
    this.facebook = facebook;
}
public List<Reference> getFacebookFriends() {
    // Get Friend List
    return getFacebook().friendOperations().getFriends();
}

【问题讨论】:

    标签: facebook spring spring-security quartz-scheduler spring-social-facebook


    【解决方案1】:

    我通过关注Facebook4j找到了另一个解决方案

    ConfigurationBuilder cb = new ConfigurationBuilder();
        cb.setDebugEnabled(true)
          .setOAuthAppId("app_id")
          .setOAuthAppSecret("app_secret")
          .setOAuthAccessToken("user_token")
          .setOAuthPermissions("email,publish_actions,public_profile, basic_info,  user_likes");
        FacebookFactory ff = new FacebookFactory(cb.build());
        // Generate facebook instance.
        this.facebook = ff.getInstance();
    

    这里的问题是,当我的工作运行并调用 Facebook API 时,它没有用户访问令牌,因此在将消息发布到墙上时,我的石英工作没有发布权限。

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多