Criar uma aplicação Java que representa postagens. Essas postagens possuem um autor e 0..x comentários possíveis.
Para construir essa aplicação, foi utilizado um banco de dados não relacional, pois este possui maior velocidade executando consultas simples e mapeamento mais simplório. O post está aninhado com os comentários e referenciado pelo autor.
Para desenvolver essa solução, foi necessário ter alguns novos conceitos estruturados. Eles são: DTO, documentos referenciados e aninhados, query methods, tratamento de exceções.
Consiste em abstrair da entidade apenas as informações para a query. Dessa forma, cria-se uma nova classe apenas com os atributos que devem aparecer na requisição. Para que isso funcione, precisamos sobrescrever o construtor da nova classe de forma que receba a entidade como parâmetro. Observe abaixo uma das DTO's implementadas.
public AuthorDTO(User obj) {
id = obj.getId();
name = obj.getName();
}
O mongoDB se trata de um banco de dados orientado a documentos. Dentro da organização desse banco, podemos relacionar os documentos por referência ou aninhando-os.
Quando um documento aponta para outro, não carregando as suas informações, apenas referenciando para o ID do relacionamento. Isso é possível através da anotação @DBRef, que está presente no seguinte documento.
@DBRef(lazy = true)
private List<Post> posts = new ArrayList<>();
Documento aninhado ocorre quando o primeiro possui uma cópia dos dados de seu relacionado. Isso não necessita de sintaxe, sendo executado por padrão toda vez que há um relacionamento entre documentos. Basta apenas incluir tal classe dentro de outra.
São os métodos presentes dentro da interface que implementa o MongoRepository. Podemos consultar algumas implementações já estipuladas na documentação do MongoDB, como a utilizada no seguinte código:
List<Post> findByTitleContainingIgnoreCase(String text);
Como também é possível criar query methods, utilizando a anotação @query
, como podemos oberservar abaixo.
@Query("{ title: { $regex: ?0, $options: 'i' } }")
List<Post> searchTitle(String text);
- Sintaxe pre-definida
- Criar uma query personalizada
Criar uma classe que tenha todas as informações necessárias para imprimir .json
Criar uma classe de controle que capta essas exceções lançadas e imprime o corpo pré-definido.
No modelo a seguir, temos a representação UML dos documentos e relacionamentos dentro dessa aplicação.
-
Funcionalidade 1: GET dos usuários, posts por ID, titulo e por palavras.
-
Funcionalidade 2: POST de autores.
-
Funcionalidade 3: DELETE de autores.
-
Funcionalidade 3: UPDATE (PUT) de autores.
(GET) e (POST) de usuários
https://localhost:8080/users
(GET) usuários por id
https://localhost:8080/users/{id}
(PUT) e (DELETE) de um usuário
https://localhost:8080/users/{id}
(GET) pesquisa um post utilizando um texto dentro de um período minimo e máximo
https://localhost:8080/posts/searchbytitle?text={texto}
Consulte os demais end points nas classes de recursos de cada entidade.
Linguagem:
Frameworks:
Você pode acessar o código fonte do projeto.