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