spring pom设置
在本系列的第一部分中 ,我们研究了如何使用StackExchange REST API来检索其主要问题。 第二部分将重点设置使用Spring Social Twitter项目与Twitter REST API交互所需的支持。 最终目标是能够在多个帐户上每天发送两个问题,每个帐户集中讨论一个主题。
1.使用Spring Social Twitter
使用Spring Social Twitter项目所需的必需依赖项很简单。 首先,我们定义spring-social-twitter本身:
<dependency><groupId>org.springframework.social</groupId><artifactId>spring-social-twitter</artifactId><version>1.0.3.RELEASE</version>
</dependency>
然后,我们需要使用更多最新版本覆盖其中的某些依赖项:
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>3.2.2.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>3.2.2.RELEASE</version>
</dependency>
<dependency><artifactId>jackson-mapper-asl</artifactId><groupId>org.codehaus.jackson</groupId><version>1.9.12</version>
</dependency>
spring-social-twitter将spring-core和spring-web都定义为依赖项,但旧版本分别为3.0.7.RELEASE和3.1.0.RELEASE 。 在我们自己的pom中覆盖它们可以确保项目使用的是我们定义的最新版本,而不是这些较旧的继承版本。
2.创建一个Twitter应用程序
这个用例-用个人帐户而不是其他用户帐户发推文,很简单。 如果应用程序需要在其每个Twitter帐户上为多个用户发推文,它很简单,这使我们可以省去大多数OAuth编排 。 因此,对于我们的用例,我们将直接创建TwitterTemplate ,因为我们可以手动设置所需的一切。 我们需要的第一件事是一个开发应用程序 –登录后可以在此处创建一个应用程序。创建该应用程序后,我们将具有“ 消费者密钥”和“ 消费者秘密” –这些是从“应用程序”页面获得的–在“ 详细信息”选项卡上的“ OAuth设置 。 另外,为了允许应用程序在该帐户上鸣叫,必须将“ 读取和写入访问”设置为替换默认的“ 只读”特权。
3.设置一个
接下来, TwitterTemplate需要提供访问令牌和访问令牌密钥 。 也可以从“应用程序”页面(在“ 详细信息”选项卡下,“ 创建我的访问令牌”)生成这些密码 。 然后,可以从OAuth工具标签下检索访问令牌和密钥。 始终可以通过“ 重新创建我的访问令牌”操作在“ 详细信息”选项卡上重新生成新的。 至此,我们拥有了所需的一切-使用者密钥和使用者密钥,以及访问令牌和访问令牌密钥-这意味着我们可以继续为该应用程序创建TwitterTemplate :
new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret);
4.每个帐户一个模板
现在,我们已经了解了如何为单个帐户创建一个TwitterTemplate ,我们可以再次回顾一下用例-我们需要在多个帐户上发推文-这意味着我们需要多个TwitterTemplate实例。 可以使用简单的机制根据要求轻松创建它们:
@Component
public class TwitterTemplateCreator {@Autowiredprivate Environment env;//public Twitter getTwitterTemplate(String accountName) {String consumerKey = env.getProperty(accountName + ".consumerKey");String consumerSecret = env.getProperty(accountName + ".consumerSecret");String accessToken = env.getProperty(accountName + ".accessToken");String accessTokenSecret = env.getProperty(accountName + ".accessTokenSecret");Preconditions.checkNotNull(consumerKey);Preconditions.checkNotNull(consumerSecret);Preconditions.checkNotNull(accessToken);Preconditions.checkNotNull(accessTokenSecret);//TwitterTemplate twitterTemplate =new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret);return twitterTemplate;}
}
当然,这四个安全工件是按属性外部化到属性文件中的; 例如,对于SpringAtSO帐户 :
SpringAtSO.consumerKey=nqYezCjxkHabaX6cdte12g
SpringAtSO.consumerSecret=7REmgFW4SnVWpD4EV5Zy9wB2ZEMM9WKxTaZwrgX3i4A
SpringAtSO.accessToken=1197830142-t44T7vwgmOnue8EoAxI1cDyDAEBAvple80s1SQ3
SpringAtSO.accessTokenSecret=ZIpghEJgFGNGQZzDFBT5TgsyeqDKY2zQmYsounPafE
这实现了灵活性和安全性的良好结合-安全凭证不是代码库的一部分(它是开源的 ),而是独立存在于文件系统上,并由Spring拾取并通过简单的配置在Spring Enviroment中可用:
@Configuration
@PropertySource({ "file:///opt/stack/twitter.properties" })
public class TwitterConfig {//
}
Spring的属性是之前已经讨论过的主题,因此在此我们将不进一步讨论该主题。 最后, 测试将验证一个帐户是否具有在Spring Environment中容易获得的必要安全信息; 如果属性不存在,则getTwitterTemplate逻辑应通过NullPointerException测试失败:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TwitterConfig.class })
public class TwitterTemplateCreatorIntegrationTest {@Autowiredprivate TwitterTemplateCreator twitterTemplateCreator;//@Testpublic void givenValidAccountSpringAtSO_whenRetrievingTwitterClient_thenNoException() {twitterTemplateCreator.getTwitterTemplate(SimpleTwitterAccount.SpringAtSO.name());}
}
5.鸣叫
随着TwitterTemplate创造,让我们来看啁啾的实际行动。 为此,我们将使用一个非常简单的服务,接受一个TwitterTemplate并使用其底层API创建一条推文:
@Service
public class TwitterService {private Logger logger = LoggerFactory.getLogger(getClass());//public void tweet(Twitter twitter, String tweetText) {try {twitter.timelineOperations().updateStatus(tweetText);} catch (RuntimeException ex) {logger.error("Unable to tweet" + tweetText, ex);}}
}
6.测试
最后,我们可以编写一个集成测试来执行为帐户配置TwitterTemplate并在该帐户上发布Twitter的整个过程:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TwitterConfig.class })
public class TweetServiceLiveTest {@Autowiredprivate TwitterService twitterService;@Autowiredprivate TwitterTemplateCreator twitterCreator;//// tests@Testpublic void whenTweeting_thenNoExceptions() {Twitter twitterTemplate = twitterCreator.getTwitterTemplate("SpringAtSO");twitterService.tweet(twitterTemplate, "First Tweet");}
}
7.结论
在这一点上,我们创建的Twitter API与StackExchange API完全分开,可以独立于该特定用例使用,以进行任何鸣叫。 从Stack Exchange帐户发布问题时,下一步的逻辑步骤是创建一个组件–与我们到目前为止介绍的Twitter和StackExchange API交互–这将是本系列下一篇文章的重点。
翻译自: https://www.javacodegeeks.com/2013/04/spring-social-twitter-setup.html
spring pom设置