Artigo no estilo: Curso

Por que eu devo ler este artigo:

Este artigo é útil porque apresenta alguns dos recursos disponíveis a partir da versão 4 do Spring Framework. Para isso, será demonstrado como fazer uso desses recursos no decorrer do desenvolvimento de uma aplicação web.

Esse conteúdo é bastante importante principalmente por ajudar o leitor a se familiarizar com as novas soluções disponibilizadas pelo Spring, possibilitando uma análise do funcionamento destas e facilitando a identificação de quando adotá-las.

O Spring Framework chega à versão 4 ultrapassando 10 anos de existência, contados a partir do seu release inicial – mais especificamente, março de 2004. Na época, esta versão inicial já era bastante inovadora, apresentando-se como um container leve que oferecia a criação e gerenciamento de beans, injeção de dependências, controle de transações (de forma declarativa e programática), suporte ao Hibernate, um framework MVC completo, o Spring MVC, classes utilitárias para o desenvolvimento de DAOs, uso da tecnologia JDBC e a integração com EJBs.

O conjunto das soluções providas pelo Spring Framework permite a construção de qualquer tipo de aplicação, não estando restrito apenas a soluções para a plataforma Web. Além disso, a facilidade de configuração e execução do container simplifica o desenvolvimento e a criação do ambiente para execução de testes integrados.

Durante estes mais de 10 anos, o Spring obteve uma evolução grandiosa, acumulando inovações em suas principais funcionalidades. Podemos citar, por exemplo, o uso de anotações para a criação, gerenciamento e injeção de beans, bem como o lançamento de novos módulos como o Spring Security, Spring Data, Spring Batch, Spring Integration, entre outros.

A versão 4 do Spring Framework, lançada em Dezembro de 2013, vem com o compromisso de manter a plataforma alinhada com as tecnologias mais recentes para o desenvolvimento Java.

Nesta versão, além de melhorias em funcionalidades do próprio framework, foram adicionados suporte para as plataformas Java 8 e Java EE 7, a evolução de recursos no desenvolvimento de interfaces REST e o suporte à tecnologia de WebSockets. Dito isso, o objetivo deste artigo é apresentar de forma prática algumas destas novidades trazidas no lançamento do Spring Framework 4, por meio do desenvolvimento das funcionalidades de uma aplicação web.

Nesta primeira parte, alguns dos novos recursos serão apresentados na implementação de funcionalidades de infraestrutura e backend da aplicação, enquanto a segunda parte terá o foco em expor recursos utilizados na criação da camada de apresentação.

A aplicação proposta

Para realizar a demonstração dos recursos disponíveis no Spring Framework 4, foi idealizado um sistema para controle de tarefas. Sendo assim, no decorrer do desenvolvimento deste sistema, serão utilizadas as novas funcionalidades do Spring de uma maneira simples, focando sempre em facilitar o entendimento do funcionamento e o propósito (solução) oferecido por cada recurso.

O sistema de controle de tarefas

O sistema de Controle de Tarefas tem como objetivo principal facilitar o controle das atividades gerenciadas por um grupo de pessoas. Assim, para cada pessoa com acesso ao sistema, denominada usuário, existirá uma associação com um perfil, e cada perfil concede níveis de operação diferentes dentro do sistema.

No sistema de Controle de Tarefas, foram definidos dois perfis de usuário, detalhados a seguir:

  1. Administrador: Este perfil permite ao usuário a criação de tarefas e o acompanhamento (em tempo real) de todas as tarefas cadastradas no sistema;
  2. Usuário: O usuário com este perfil pode assumir tarefas e consequentemente mudar o status das tarefas para as quais ele é o responsável.

Além das informações de usuário, o sistema também manterá os dados que permitem a identificação, autoria, responsabilidade e o controle dos possíveis estados de uma tarefa.

Os estados das tarefas gerenciadas pelo sistema são:

  • Cadastrada: Este é o estado inicial de uma tarefa, atribuído na criação da tarefa por um usuário com perfil Administrador;
  • Iniciada: A tarefa neste estado foi iniciada por um usuário com perfil Usuário, que neste caso assumiu o papel de responsável por ela;
  • Concluída: Ao alcançar este estado, a tarefa foi concluída com sucesso pelo usuário responsável;
  • Descartada: Este estado conclui a tarefa com insucesso, indicando que o usuário responsável optou por anular a tarefa.

A seguir estão as principais classes do domínio do sistema Controle de Tarefas, criado a partir da descrição das funcionalidades e exibido em detalhes na Figura 1:

  • br.com.jm.tarefas.domain.IdentificadorUsuario: Classe que representa o identificador do usuário no sistema. Em nosso exemplo utilizamos o e-mail como identificador;
  • br.com.jm.tarefas.domain.PerfilUsuario: Enumeração com o domínio de perfis de usuário;
  • br.com.jm.tarefas.domain.Usuario: Classe que representa um usuário no sistema, contendo alguns atributos básicos e a associação com um identificador e perfil, além do relacionamento com as tarefas para as quais é o autor ou responsável;
  • br.com.jm.tarefas.domain.IdentificadorTarefa: Classe que representa o identificador da tarefa no sistema. Em nosso exemplo utilizamos um código sequencial numérico;
  • br.com.jm.tarefas.domain.StatusTarefa: Enumeração contendo o domínio de estados de uma tarefa;
  • br.com.jm.tarefas.domain.Tarefa: Classe que representa uma tarefa no sistema. Possui algumas informações pertinentes à tarefa e associação com identificador, autor e responsável;
  • br.com.jm.tarefas.domain.ControleTarefasException: Esta é a classe base de exceção para os erros ocorridos nas operações de gerenciamento das tarefas;
  • br.com.jm.tarefas.domain.TransicaoStatusTarefasException: Esta classe de exceção representa o erro na tentativa de realizar a transição entre status de uma tarefa;
  • br.com.jm.tarefas.domain.TarefaManipulacaoUsuarioInvalidoException: Exceção que representa a tentativa de manipulação de uma tarefa por um usuário que não seja o responsável por esta;
  • br.com.jm.tarefas.domain.PerfilSemPermissaoCriacaoTarefaException: Esta exceção indica a tentativa de criação de tarefa por um usuário cujo perfil não permite esta operação.

Modelo de classes do sistema
abrir imagem em nova janela

Figura 1. Modelo de classes do sistema.

Para construção do sistema de Controle de Tarefas será utilizada a arquitetura multicamadas, concebida com o uso da abordagem Domain Driven Design. As quatro camadas (domain, application, infrastructure e user interface) foram organizadas em pacotes conforme detalhado a seguir:

  • br.com.jm.tarefas.domain: Este pacote simboliza a camada principal, que abriga as classes que representam o domínio e encapsulam as regras de negócio. Neste pacote estão:
    o As classes do domínio apresentadas na Figura 1;
    o As interfaces TarefaRepository e UsuarioRepository, contendo as operações para o acesso aos dados das entidades Tarefa e Usuario, respectivamente;
    o O subpacote dto, contendo as classes do padrão DTO que representam, de forma simplificada, as informações do domínio.
  • br.com.jm.tarefas.application: Neste pacote está representada a camada de aplicação, armazenando as classes de serviço responsáveis por receber as requisições da camada de apresentação, recuperar objetos de domínio necessários e disparar nestes objetos as ações solicitadas pelo usuário.
    A classe GerenciamentoTarefasService, presente neste pacote, processa as requisições da camada de apresentação, recuperando as informações de usuário e tarefa envolvidas na solicitação
  • br.com.jm.tarefas.infrastrucuture: Pacote que armazena a camada com código de infraestrutura necessário para o funcionamento da aplicação; por exemplo: o acesso aos dados persistidos, configurações, envio de e-mail, etc. Neste pacote temos os seguintes artefatos que merecem destaque:
    o A implementação da anotação @ServicoTransacional, que será detalhada no decorrer do artigo, no tópico Anotações Compostas;
    o A classe InicializadorBD, que corresponde a uma classe utilitária para inicialização do banco de dados com alguns dados de exemplo, recurso útil no ambiente de desenvolvimento;
    o A classe PublicadorAtualizacaoTarefa, que executa a publicação das informações de criação e atualização de tarefas através de um subsistema de mensagens que será detalhado no tópico WebSockets, apresentado na segunda parte deste artigo;
    o O subpacote config, que contém, principalmente, as classes de configuração do container Spring, utilizando a abordagem de configuração com o uso de classes (JavaConfig);
    o O subpacote security, que contém algumas classes criadas para a customização do uso do módulo Spring Security.
  • br.com.jm.tarefas.interfaces.web: Este pacote é a camada de apresentação do sistema, sendo responsável por receber as solicitações do usuário e repassar estas solicitações para a camada de aplicação.
    A classe GerenciamentoTarefaController, contida neste pacote, oferece todas as operações para o gerenciamento das tarefas por uma interface REST, com a troca de informações em formato JSON. O desenvolvimento da camada de apresentação será abordado na segunda parte deste artigo.

Na Figura 2 podemos ver, com mais detalhes, a organização dos pacotes (camadas) e também algumas das principais classes do sistema de Controle de Tarefas, já citadas anteriormente.

Organização dos
pacotes (camadas)
abrir imagem em nova janela

Figura 2. Organização dos pacotes (camadas).

A interface web

A interface do sistema de Controle de Tarefas será bastante simples, contando apenas com duas telas:

  • A tela de login utilizada para autenticação dos usuários;
  • A tela principal home, organizada com um mecanismo de abas, sendo esta a tela de destino após a autenticação efetuada com sucesso.

As abas disponíveis, o propósito de cada uma e o acesso pelos perfis de usuário serão detalhados a seguir.

Autenticação dos usuários

A autenticação dos usuários no sistema será efetuada mediante e-mail e senha (previamente cadastrados), solicitados pela tela de login apresentada na Figura 3. Após o login efetuado com sucesso, o usuário será direcionado para a tela home, onde serão exibidas as abas com as informações de tarefas de acordo com o perfil identificado no processo de autenticação.

Tela de login

Figura 3. Tela de login.

A aba Tarefas

Caso o usuário autenticado esteja associado com o perfil Administrador, será apresentada a tela home disponibilizando apenas a aba Tarefas, conforme exibido na Figura 4.

Funcionalidades da aba Tarefa
abrir imagem em nova janela

Figura 4. Funcionalidades da aba Tarefas.

Os três pontos destacados nesta figura estão detalhados a seguir:

  1. O botão de inclusão de tarefas, exibido somente para o perfil Administrador, aciona um popup modal (Figura 5) que permite a inclusão de uma nova tarefa;
  2. O perfil Administrador visualiza somente a aba Tarefas, que lista todas as tarefas cadastradas no sistema;
  3. A coluna de nome Responsável, ainda na aba Tarefas, indica qual é o usuário responsável pela tarefa, caso exista um.

Popup para criação de uma nova Tarefa

Figura 5. Popup para criação de uma nova Tarefa.

Para facilitar o acompanhamento pelos administradores, esta aba será atualizada em tempo real, refletindo as modificações ocorridas nas tarefas cadastradas no sistema.

A aba Minhas Tarefas

Na Figura 6 é exibida a tela home para o usuário com perfil Usuário. Como pode ser verificado, para esse tipo de usuário é disponibilizada a aba Minhas Tarefas.

Funcionalidades da aba Minhas Tarefas
abrir imagem em nova janela

Figura 6. Funcionalidades da aba Minhas Tarefas.

Assim como realizado na Figura 5, na Figura 6 temos três pontos a detalhar, a saber:

  1. A aba Minhas Tarefas lista todas as tarefas para as quais o responsável corresponde ao usuário logado no sistema;
  2. Botão que permite a conclusão ...
    Quer ler esse conteúdo completo? Tenha acesso completo