Статьи

Весенний социальный пример по весенней загрузке или как я перестал волноваться и полюбил автоконфигурацию

Что касается Spring Boot 1.1.0.RC1, добавлена ​​автоконфигурация и стартовый pom Spring Social, что означает, что мне не нужно будет добавлять сотню зависимостей к моему pom, и многие бессмысленные конфигурации Spring будут обрабатываться для меня. Давайте посмотрим, как это работает на примере.

Я буду реализовывать веб-приложение из двух страниц. Один покажет временную шкалу данного пользователя в Twitter, а другой — информацию о профиле пользователя. Вот мой пом

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    <modelversion>4.0.0</modelversion>
 
    <groupid>nr.co.caught</groupid>
    <artifactid>BootTwitterJoy</artifactid>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
 
    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-parent</artifactid>
        <version>1.1.0.RC1</version>
    </parent>
 
    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-social-twitter</artifactid>
        </dependency>
 
        <!-- Both are needed for jsp support-->
        <dependency>
            <groupid>org.apache.tomcat.embed</groupid>
            <artifactid>tomcat-embed-jasper</artifactid>
        </dependency>
        <dependency>
            <groupid>javax.servlet</groupid>
            <artifactid>jstl</artifactid>
        </dependency>
 
    </dependencies>
 
    <!-- Needed for fat jar -->
    <build>
        <plugins>
            <plugin>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-maven-plugin</artifactid>
            </plugin>
        </plugins>
    </build>
 
    <!-- Add Spring repositories -->
    <!-- (you don't need this if you are using a .RELEASE version) -->
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginrepositories>
        <pluginrepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginrepository>
        <pluginrepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginrepository>
    </pluginrepositories>
 
</project>

Как вы можете видеть, у меня есть зависимость для начинающих социальных сетей и Twitter, которая предоставляет мне возможности Spring Social и Web. Я добавлю jasper и jstl для моих страниц jsp для работы. Моя часть репозиториев довольно многолюдна из-за веховых репозиториев.

Теперь мы добавим наш Сервис для вызовов методов Твиттера и Контроллер для обработки запросов. Наш контроллер прост и понятен:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
@Controller
public class TwitterController {
 
    @Autowired
    private TwitterService twitterService;
 
 @RequestMapping(value = "/timeline/{twitterUser}")
 public String getUserTimeline(@PathVariable String twitterUser, Model model) {
        model.addAttribute("tweets", twitterService.getUserTimeline(twitterUser));
        model.addAttribute("user", twitterUser);
 
  return "timeline";
 }
 
    @RequestMapping(value = "/profile/{twitterUser}")
    public String getUserProfile(@PathVariable String twitterUser, Model model) {
        model.addAttribute("userProfile", twitterService.getUserProfile(twitterUser));
 
        return "profile";
    }
}

Если запрос приходит с «/ timeline / username», наш контроллер получит временную шкалу пользователя, а если он будет с «/ profile / username», он получит профиль пользователя от TwitterService. Вот наш сервис Twitter:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
@Service
public class TwitterService {
 
   @Autowired
    private Twitter twitter;
 
    public List < Tweet > getUserTimeline(String twitterUser) {
        TimelineOperations timelineOps = twitter.timelineOperations();
        List tweets = timelineOps.getUserTimeline("@" + twitterUser);
 
        return tweets;
    }
 
    public TwitterProfile getUserProfile(String twitterUser) {
        UserOperations userOperations = twitter.userOperations();
        TwitterProfile userProfile = userOperations.getUserProfile(twitterUser);
 
        return userProfile;
    }
}

У нас есть объект Twitter, который будет создан благодаря автоконфигурации Spring Boot. Мы просто должны предоставить идентификатор приложения и секретный ключ приложения (также называемый ключом пользователя и секретом пользователя) в свойствах нашего приложения, и Boot сделает все остальное. Я цитирую объяснение объекта Twitter из Spring Javadoc:

«Этот экземпляр TwitterTemplate ограничен только выполнением операций, требующих авторизации клиента. Например, вы можете использовать его для поиска в Twitter, но вы не можете использовать его для публикации обновления статуса. Указанные здесь учетные данные клиента используются для получения токена доступа клиента через OAuth 2 Client Credentials Grant ».

Если вы попытаетесь обновить состояние, вы получите «org.springframework.social.MissingAuthorizationException: для операции требуется авторизация, но привязка API была создана без авторизации». Для дальнейшей функциональности Twitter нам потребуется предоставить токен доступа и секретные ключи доступа, но, насколько я знаю, автоконфигурация еще не справилась бы с этими случаями.
Мои JSP:
profile.jsp:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
</head>
<body>
<img src="${userProfile.profileImageUrl}"/> 
 
Screen name: ${userProfile.screenName}
 
Name: ${userProfile.name}     
 
Description: ${userProfile.description}  
 
Location:  ${userProfile.location} 
 
Followers: ${userProfile.followersCount} 
 
</body>
</html>

Как видите, профиль берет userProfile, предоставленный нашим контроллером, и показывает основные свойства профиля. timeline.jsp

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Time Line for <c:out value="${twitterUser}" /> TimeLine</title>
</head>
<body>
<ul>
    <c:forEach items="${tweets}" var="tweet">
        <li>${tweet.text}
 at <c:out value="${tweet.createdAt}"/></li>
         
 
    </c:forEach>
</ul>
</body>
</html>

Твиты показаны с их текстом и датой создания. Содержание моего application.properties:

1
2
3
4
5
6
7
# Config for JSPs
spring.view.prefix: /WEB-INF/jsp/
spring.view.suffix: .jsp
 
# SPRING SOCIAL TWITTER (TwitterAutoConfiguration)
spring.social.twitter.appId= someAppId
spring.social.twitter.appSecret= someSecretId

Свойства spring.view предназначены для обработки jsp. Spring.social.twitter свойства и могут быть получены из http://dev.twitter.com . Просто войдите в систему под своей учетной записью Twitter, создайте приложение и получите ключи API. Вот результат:

профиль

график

  • Вы можете проверить код на GitHub .