API REST desenvolvida em Spring Boot para análise de sentimentos de comentários de usuários. A aplicação consome um modelo externo de Machine Learning (Python), persiste dados em MySQL e utiliza JWT para segurança e autenticação.
- Tecnologias Utilizadas
- Dependências e Versões
- Estrutura do Projeto
- Configuração do Ambiente
- Como Executar
- Autenticação e Segurança
- Endpoints de Negócio
- Observações Finais
- Java 17 ou superior
- Spring Boot 3.5.8
- MySQL – Banco de dados relacional
- Spring Security + JWT – Autenticação e Autorização
- Maven – Gerenciador de dependências
- Google Gemini – Integração para tradução via LangChain4j
- Python – Modelo de análise de sentimentos (microsserviço externo)
Principais dependências do projeto:
| Dependência | Versão | Finalidade |
|---|---|---|
| Spring Boot Starter Web | 3.5.8 | Criação da API REST |
| Spring Boot Starter Data JPA | 3.5.8 | Persistência de dados com JPA/Hibernate |
| Spring Boot Starter Validation | 3.5.8 | Validação de requisições |
| MySQL Driver | Runtime | Conexão com MySQL |
| JJWT (Json Web Token) | 0.11.5 | Geração e validação de tokens |
| LangChain4j | 0.36.2 | Integração com LLMs |
| LangChain4j Gemini | 0.36.2 | Tradução automática de textos |
| Lombok | — | Redução de código boilerplate |
| Spring Boot DevTools | 3.5.8 | Ferramentas de desenvolvimento |
| Spring Boot Starter Test | 3.5.8 | Testes automatizados |
📌 Consulte o arquivo
pom.xmlpara a lista completa.
src/main/java/com/hackathon/sentiments/api
├── config
│ └── AppConfig.java # Configurações globais (Beans)
│
├── controller
│ ├── AutenticacaoController.java # Endpoints de Login e Cadastro
│ └── SentimentController.java # Endpoints de Análise de Sentimento
│
├── dto
│ ├── ComentarioRequest.java # Entrada de dados (Texto)
│ ├── LoginRequest.java # Entrada de dados (Login)
│ ├── SentimentoResponse.java # Resposta da API
│ └── ... (Outros DTOs de Estatísticas)
│
├── entity
│ ├── Comentario.java # Entidade JPA (Tabela Comentários)
│ └── Usuario.java # Entidade JPA (Tabela Usuários)
│
├── exception
│ ├── SenhaIncorretaException.java # Tratamento de erro de senha
│ ├── UsuarioJaExistenteException.java # Tratamento de conflito de usuário
│ └── UsuarioNaoEncontradoException.java
│
├── repository
│ ├── ComentarioRepository.java # Interface JPA (Acesso a dados)
│ └── UsuarioRepository.java # Interface JPA (Acesso a dados)
│
├── security
│ ├── FiltroJwt.java # Filtro para validar tokens
│ ├── JwtUtilitario.java # Geração e leitura de JWT
│ └── SecurityConfig.java # Configuração do Spring Security
│
├── service
│ ├── ComentarioService.java # Lógica de negócio de comentários
│ ├── SentimentPythonClient.java # Cliente HTTP para o microserviço Python
│ ├── TraducaoService.java # Integração com API Gemini
│ └── UsuarioService.java # Lógica de negócio de usuários
│
└── SentimentAnalysisApplication.java # Classe principal (Boot)
- config: Configurações globais da aplicação e injeção de dependências.
- controller: Responsável por expor os endpoints REST e receber as requisições.
- dto: Objetos de Transferência de Dados para isolar a camada de domínio.
- entity: Classes que representam as tabelas do banco de dados (ORM).
- exception: Classes para tratamento personalizado de erros e exceções de negócio.
- repository: Interfaces de acesso aos dados (Spring Data JPA).
- security: Lógica de autenticação, filtros de token JWT e configuração de segurança.
- service: Regras de negócio e orquestração de serviços externos (Python e Gemini).
- Java 17 ou superior
- Maven 3.6+
- MySQL 8+ instalado e em execução
- Modelo Python de análise de sentimentos rodando
Configure a conexão com MySQL no arquivo:
src/main/resources/application.properties
Exemplo de configuração:
# Configuração do MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/sentiments_db?createDatabaseIfNotExist=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=sua_senha
# Configuração do Driver e Dialeto
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
# Configuração do JPA/Hibernate
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true💡 Dica: O parâmetro createDatabaseIfNotExist=true tenta criar o banco automaticamente se ele não existir.
Antes de iniciar, certifique-se de que o MySQL está rodando e que você configurou as credenciais no arquivo src/main/resources/application.properties.
- Abra a pasta do projeto no IntelliJ IDEA.
- Aguarde o Maven baixar todas as dependências e indexar o projeto.
- Navegue até
src/main/java/com/hackathon/sentiments/api. - Clique com o botão direito na classe
SentimentAnalysisApplication.javae selecione Run. - A aplicação estará disponível em
http://localhost:8080.
Ideal se você já tem o Maven instalado e configurado no terminal.
# 1. Clone o repositório
git clone <url-do-repositorio>
cd sentiment-analysis-api
# 2. Execute o projeto via plugin do Spring Boot
mvn spring-boot:run# 1. Limpe a build anterior e empacote o projeto
mvn clean package
# 2. Navegue até a pasta target e execute o arquivo .jar gerado
java -jar target/sentiment-analysis-api-0.0.1-SNAPSHOT.jarA maioria dos endpoints é protegida. Você precisa se autenticar para obter um Token JWT.
POST /auth/registrar
{
"usuario": "admin@email.com",
"senha": "123"
}
POST /auth/login
{
"usuario": "admin@email.com",
"senha": "123"
}
Resposta:
{
"token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1p..."
}
⚠️ Importante: Copie otokenda resposta. Para acessar os endpoints abaixo, você deve enviá-lo no Header da requisição: Authorization:Bearer eyJhbGciOiJIUzI1Ni...
Endereço Base: http://localhost:8080
🔒 Nota: Todos os endpoints abaixo (exceto
/auth) exigem o Header:Authorization: Bearer <seu_token_jwt>
Analisa o sentimento de um comentário em português.
Endpoint: POST /sentiment
Requisição:
{
"texto": "Este produto é excelente, superou minhas expectativas!"
}Resposta:
{
"previsao": "Positivo",
"probabilidade": 0.9245
}Traduz comentários em outros idiomas para português usando Google Gemini antes de analisar o sentimento.
Endpoint: POST /sentiment/tradutor
Requisição:
{
"texto": "This product is very good and I recommend it"
}Resposta:
{
"textoTraduzido": "Este produto é muito bom e eu o recomendo",
"previsao": "Positivo",
"probabilidade": 0.9572
}Retorna os dados do usuário logado e a lista de comentários que ele já enviou.
Endpoint: GET /auth/minhaconta
Resposta:
{
"id": 1,
"email": "usuario@teste.com",
"comentarios": [
{
"id": 10,
"texto": "Gostei muito!",
"sentimento": "Positivo"
}
]
}Retorna as 10 palavras mais frequentes encontradas nos comentários analisados.
Endpoint: GET /sentiment/palavras-mais-usadas
Resposta:
[
{
"palavra": "bom",
"quantidade": 45
},
{
"palavra": "produto",
"quantidade": 38
},
{
"palavra": "excelente",
"quantidade": 25
}
]Fornece o total de comentários analisados separados por sentimento.
Endpoint: GET /sentiment/estatisticas
Resposta:
{
"positivos": 120,
"negativos": 45
}A API pode ser testada utilizando as seguintes ferramentas:
- Postman
- Insomnia
- cURL – Testes via linha de comando
Exemplo com cURL (com Autenticação):
# 1. Primeiro faça login para pegar o token
# (Copie o token da resposta)
# 2. Depois faça a requisição usando o token
curl -X POST http://localhost:8080/sentiment \
-H "Content-Type: application/json" \
-H "Authorization: Bearer SEU_TOKEN_AQUI" \
-d '{"texto": "Produto de péssima qualidade"}'⚠️ A API depende do correto funcionamento do serviço Python de análise de sentimentos- 🗄️ O MySQL deve estar ativo antes de iniciar a aplicação
- 📄 Todas as requisições e respostas utilizam o formato JSON
- 🔐 Configure adequadamente as credenciais do banco e chaves de API no
application.properties