14 fev 2017

Criando um projeto java com Spring, utilizando SPRING INITIALIZR em integração com Facebook

Neste post vou apresentar um tutorial simples de como configurar um projeto com Spring Boot em integração com Facebook, utilizando API de quickStart SPRING INITIALIZR. Inicialmente, a idéia desta aplicação era fazer um post na minha linha do tempo do facebook, mas depois de algumas pesquisas, descobrimos que para que isso aconteça, devemos solicitar na página Facebook for Devolopers, informando alguns dados pessoais e motivos para qual fim e depois aguardar a liberação. Por esse motivo, resolvi apenas recuperar os posts (feed notícias) do usuário logado, que é uma permissão que o facebook já deixa liberado como default depois de apenas se cadastrar.

SPRING INITIALIZR fornece uma interface web bem simples para o usuário. Podendo gerar seu projeto a partir de uma estrutura de configurações pré-moldadas. São configurações de versões do java/spring boot, grupo/nome do projeto, série de lista de dependências e etc.

A interface é apresentada de uma forma simplificada para usuários que já tem definidos as dependências que vão utilizar. Mas ao clicar em Switch to the full version é apresentado diversas configurações e dependências. Neste tutorial vamos gerar um Maven Project com a versão do spring boot 1.5.1, é uma versão mais estável e já utilizamos em alguns projetos internos.
Demos um nome e um grupo para o projeto, escolhemos algumas dependências em especial Facebook e geramos o projeto em zip.

Configuração do modelo spring

Logo depois, extrai o arquivo e pelo terminal acessei a pasta onde encontra-se o arquivo pom.xml, e rodei o comando mvn eclipse:eclipse. Este comando prepara o projeto para ser importado pelo eclipse, baixando todas as dependências necessárias. Depois que terminou, importei o projeto pelo eclipse como maven project.
Criei uma conexão local mysql, no meu caso usei o Navicat. No pom.xml, adicionei a dependência do mysql e na classe application.properties adicionei as configurações para a conexão com meu banco local. Configurado também neste projeto o Lombok e o Swagger que é que um “ajudante” para projetar, gerar documentações para API’s e realizar simulações reais do controller criado.

Para começar a usufruir o spring social, criei um AppId e AppSecret e passei essas credenciais no application.properties. Ficando assim:
spring.social.facebook.appId= SEU_ID
spring.social.facebook.appSecret= SUA_SECRET

Como criar? acesse aqui Criar AppId e AppSecret.

Com o projeto configurado, organizei a estrutura no padrão MVC. são classes para mapear a entidade que foi integrado com o mysql, conversão objetos, camada de abstração de dados do banco, etc.

Estrutura do projeto

Também foi configurada a chamada de Login usando templates do facebook, disponível aqui.

Criei um controller para recuperar alguns posts (feed notícias) do usuário logado da aplicação, onde o objeto injetado Facebook e ConnectionRepository são dependentes do spring social.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Controller
@Api(basePath = "/facebook", value = "facebook", description = "FacebookController", produces = "application/json")
@RequestMapping("/facebook")
public class FacebookController {</p>

<pre><code>@Autowired
private FacebookService facebookService;

@Autowired
private FacebookMapper facebookMapper;

private Facebook facebook;
private ConnectionRepository connectionRepository;

public FacebookController(Facebook facebook, ConnectionRepository connectionRepository) {
    this.facebook = facebook;
    this.connectionRepository = connectionRepository;
}

@GetMapping
@RequestMapping(method = RequestMethod.GET, value="/feed")
@ApiOperation(value = "Get", notes = "Recupera feed do usuario logado", response = String.class)
@ApiResponses(value = { @ApiResponse(code = 401, message = "Not Unauthorized"), @ApiResponse(code = 200, message = "OK") })
public String getFeed(Model model) {
    return facebookService.getFeed(model, facebook, connectionRepository);
}&lt;/code&gt;

Fiz a camada de serviço bem simples com pequenas validações, que foram necessárias ao “conhecer” o objeto de retorno, apenas para recuperar e salvar alguns dados que retornaram da consulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</p>

<p>PagedList feed = facebook.feedOperations().getPosts();</p>

<pre><code>    for (Post post : feed) {
        FacebookLocalDTO dto = new FacebookLocalDTO();

        dto.setNome(post.getFrom().getName());
        dto.setMensagem(post.getMessage());

        if (post.getTo() != null) {
            dto.setDestinatario(post.getTo().get(0).getName());
        }

        if (post.getPicture() != null) {
            dto.setUrl(post.getPicture());
        }

        facebookRepository.save(facebookMapper.toEntity(dto));

O método:

1
facebook.feedOperations().getPosts();

Recupera uma lista paginada de posts, dos mais antigos aos mais recentes. Percorri cada um deles e salvei no banco. Criei um novo método no controller para recuperar todos os dados que foram salvos local e consultei pelo Swagger.

Swagger

O foco deste tópico foi em mostrar a utilização do SPRINT INITIALIZR, junto com algumas configurações iniciais para a utilização do spring social.

Qualquer dúvidas ou sugestões sobre em como configurar seu projeto com spring, comunicação com banco, adicionar o swagger, inserir dependências, entre em contato github ou diego.barbosa@redspark.io.

Valeu galera =)

Leave a Comment