Quartz Job не может вызвать службу facebook (Spring Social)

Я пытаюсь вызвать API facebook через мою кварцевую работу для автоматического получения друзей, сообщений или новостных лент ... но я не могу запустить через работу. Я думаю, что ошибся в 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»: область «сеанс» не активна для текущего потока; рассмотрите возможность определения прокси-сервера с ограниченной областью действия для этого компонента, если вы собираетесь ссылаться на него из синглтона; вложенным исключением является java.lang.IllegalStateException:Запрос, связанный с потоком, не найден: вы имеете в виду атрибуты запроса за пределами фактического веб-запроса или обрабатываете запрос вне исходного потока-получателя? Если вы на самом деле работаете с веб-запросом и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet/DispatcherPortlet: В этом случае используйте RequestContextListener или RequestContextFilter, чтобы открыть текущий запрос.

Я пробовал RequestContextListener, добавляя в web.xml, но это не работает.

Звонок с работы.

@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();
}

person Minh Nguyen    schedule 15.05.2015    source источник


Ответы (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();

Проблема здесь в том, что когда моя работа запускается и вызывает API Facebook, у нее нет токена доступа пользователя, поэтому при публикации сообщения на стене моя кварцевая работа не дает разрешения на публикацию.

person Minh Nguyen    schedule 07.06.2015