Objetivo do projeto
No projeto vamos mostrar um exemplo básico de como configurar e fazer alguns endpoints para interagir com o MongoDB. O projeto consiste em ter uma entidade chamada Book, essa entidade possui 3 campos name, author e yearPublication. Para adicionar alguma lógica a mais vamos ter que não deve ser possível ter dois livros com o mesmo nome.
Pré requisitos
- Java 11
- Maven
Configuração inicial
A configuração inicial foi feita dentro do próprio site do Quarkus em https://code.quarkus.io/. Ao gerar o código já será possível ver uma classe de resource, e o pom.xml com dependencyManagement para versão mais atualizada do Quarkus.
Além da configuração básica foram adicionadas as seguintes dependências:
- quarkus-mongodb-panache -> Realizar a comunicação com o MongoDB
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-mongodb-panache</artifactId>
</dependency>
- quarkus-resteasy-jsonb -> Formatação de respostas para JSON.
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>
Como o projeto já usa dependencyManagement não é necessário declarar as versões das dependências acima.
O projeto
O projeto tem três classes para realizar as operações.
Book
Esta classe vai ser a de domínio, com isso, possui os campos que vão ser salvos, além disso, também vão ser adicionadas classes e métodos para fazer as operações no MongoDB.
import io.quarkus.mongodb.panache.MongoEntity;
import io.quarkus.mongodb.panache.PanacheMongoEntity;
@MongoEntity(collection = "book")
public class Book extends PanacheMongoEntity {
public String name;
public String author;
public Integer yearPublication;
public static Book findByName(String nameToSearch) {
return find("name", nameToSearch).firstResult();
}
}
Podemos verificar que a classe possui os seguintes elementos:
- MongoEntity -> Caso a collection do banco não possua o mesmo nome da entidade é necessário fazer essa declaração.
- PanacheMongoEntity -> Permite a classe executar as operações de banco.
- findByName -> Retorna elemento executando uma query em que o campo name é igual ao parâmetro.
BookService
Responsável por chamar a classe Book para executar as operações além de executar as regras de negócio.
import javax.enterprise.context.ApplicationScoped;
import java.util.List;
@ApplicationScoped
public class BookService {
public Book createOrUpdateBook(Book bookReceived) {
Book book = Book.findByName(bookReceived.name);
if ( book != null) {
book.author = bookReceived.author;
book.name = bookReceived.name;
book.yearPublication = bookReceived.yearPublication;
book.update();
} else {
book = new Book();
book.author = bookReceived.author;
book.name = bookReceived.name;
book.yearPublication = bookReceived.yearPublication;
book.persist();
}
return book;
}
public List<Book> findAllBooks() {
List<Book> allBooks = Book.listAll();
return allBooks;
}
public void deleteAllBooks() {
Book.deleteAll();
}
public Book findBookByName(String name) {
return Book.findByName(name);
}
}
Na classe podemos verificar temos:
-
createOrUpdateBook Recebe um livro para ser salvo, note que há uma verificação ver se o livro já existe ou não.
-
findAllBooks Busca todos os livros.
-
deleteAllBooks Remove todos os livros que foram salvos.
-
findBookByName Busca um livro pelo nome.
BookResource
Classe que possui todos os endpoints que são utilizados para executar operações definidas.
import com.luizleiteoliveira.tutorials.domain.Book;
import com.luizleiteoliveira.tutorials.service.BookService;
import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/books")
public class BookResource {
@Inject
BookService bookService;
@GET
public Book findBookByName(String name) {
return bookService.findBookByName(name);
}
@POST
public Book createBookWithParameters(Book bookReceived) {
return bookService.createOrUpdateBook(bookReceived);
}
@GET
@Path("/findAll")
public List<Book> listAllBooks() {
return bookService.findAllBooks();
}
@DELETE
@Path("/deleteAll")
public void deleteAll() {
bookService.deleteAllBooks();
}
}
application.properties
Arquivo de configuração, no caso atual possui apenas atributos para o mongo
quarkus.mongodb.connection-string = mongodb://localhost:27017
quarkus.mongodb.database = book
- quarkus.mongodb.connection-string -> url de conexão com o mongo
- quarkus.mongodb.database -> database (lembre-se que pode não ser igual a collection essa)
Conclusão
O projeto mostra como é simples e pode evoluir muito mais como o padrão de repositório. Todo projeto pode ser visto no Github, se tiver sugestões pode mandar.
Want to follow me?
You can get in contact me on this social media.
GitHub: luizleite-hotmart
Twitter: luizleite_
Twitch: coffee_and_code
Linkedin: luizleiteoliveira