Интеграция с Twitter: уже установленный ключ пользователя/секретная пара

Попытка интегрировать мой webapp с Twitter с помощью twitter4j lib.
Я зарегистрировал свое приложение на сайте twitter и получил значения Consumer key и Consumer secret.
Ничего особенного, стандартного шага OAuth.

код:

public class TwitterService {
    private final String CONSUMER_KEY = "xxx";
    private final String CONSUMER_SECRET = "yyy";

    public String fav() {
        Twitter twitter = TwitterFactory.getSingleton();
        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
...

исключение:

Caused by: java.lang.IllegalStateException: consumer key/secret pair already set.

У меня больше нет конфигурации для key и secret, любого .properties или другого файла.

EDIT:

строка комментария twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); вызывает исключение:

java.lang.IllegalStateException: OAuth consumer key/secret combination not supplied

Ответ 1

Посмотрев на код и документацию, похоже, что ваш метод создания экземпляра Twitter не рекомендуется. Если вы хотите программно настроить конфигурацию (и не использовать свойства), похоже, вам нужно поставить Configuration в TwitterFactory.

...
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.setOAuthConsumerKey(CONSUMER_KEY);
builder.setOAuthConsumerSecret(CONSUMER_SECRET);
Configuration configuration = builder.build();
TwitterFactory factory = new TwitterFactory(configuration);
Twitter twitter = factory.getInstance();
...

Синглтон, предоставляемый factory, который не был снабжен конфигурацией по умолчанию, использует реализацию Authorization, поддерживаемую конфигурацией PropertyConfiguration. Если файл свойств отсутствует, похоже, он не должен создавать экземпляр OAuthAuthorization auth, что и вызвало бы исключение, которое вы видите. Но PropertyConfiguration выполняет поиск по всему CLASSPATH для соответствующего файла свойств, поэтому, возможно, вы его не заметили. Вы можете попробовать выполнить регистрацию ключа и секрет сразу после получения экземпляра Twitter, чтобы увидеть, на что они установлены:

System.out.println("key:" + twitter.getConfiguration().getOAuthConsumerKey());
System.out.println("secret: " + twitter.getConfiguration().getOAuthConsumerSecret());

Ответ 2

Моя догадка заключается в том, что вы устанавливаете частные конечные переменные, а затем twitter.setOAuthConsumer() пытается сделать то же самое. Вам нужен только тот или другой. Вы пробовали комментировать строку twitter.setOAuthConsumer()?

Docs объясняют "предпочтительный" способ сделать это.