Este projeto é um exemplo prático de um sistema de pagamentos utilizando Spring Boot, com foco na aplicação dos princípios SOLID e em boas práticas de desenvolvimento para produção.
Demonstrar como aplicar os 5 princípios SOLID em um projeto realista, com um domínio simples: meios de pagamento financeiros como Cartão, Pix e Boleto.
Cada classe deve ter uma única responsabilidade.
PaymentRequestDTO: representa o contrato de entrada da API.Payment: entidade de domínio persistida no banco.PaymentRepository: responsável pela persistência via JPA.ReceiptGenerator: responsável pela geração de recibos.PaymentController: responsável pela entrada da requisição HTTP.
O código deve permitir extensão sem precisar ser modificado.
- A interface
PaymentStrategydefine o contrato de processamento. - Cada método (
PixPayment,CreditCardPayment,BoletoPayment) implementa essa interface. - Para adicionar
PaypalPayment, basta criar uma nova classe — sem tocar emPaymentService.
Subclasses devem poder ser utilizadas no lugar da superclasse sem afetar o funcionamento.
- Todas as implementações de
PaymentStrategysão intercambiáveis noPaymentService.
Interfaces devem ser pequenas e específicas.
- A interface
QRCodeSupporté usada somente por métodos que suportam QR Code. - A interface
PaymentStrategyexpõe apenaskey()eprocess(), sem métodos desnecessários.
Módulos de alto nível não devem depender de implementações, mas de abstrações.
PaymentServicedepende da interfacePaymentStrategy, não das classes concretas.- As estratégias são injetadas automaticamente pelo Spring via construtor.
| Recurso | Detalhe |
|---|---|
| Java 21 + Spring Boot 3.5 | Base do projeto |
| Validação | spring-boot-starter-validation com @Valid, @NotNull, @Positive |
| Persistência | Spring Data JPA + banco H2 em memória |
| DTOs | PaymentRequestDTO separado da entidade Payment |
| Tratamento de erros | GlobalExceptionHandler com @RestControllerAdvice |
| Documentação | Springdoc OpenAPI (Swagger UI) |
| Logging | SLF4J + Logback (sem System.out.println) |
| Testes | JUnit 5 + Mockito + MockMvc (14 testes) |
Pré-requisitos: Java 21, Maven
git clone https://github.com/michelspirlandeli/financial-api.git
cd financial-api
./mvnw spring-boot:runExemplo de requisição:
curl -X POST http://localhost:8080/pagamentos \
-H "Content-Type: application/json" \
-d '{"amount": 150.0, "method": "pix", "customerId": "cliente-123"}'Métodos suportados: pix, boleto, creditcard
Com a aplicação rodando, acesse:
- Swagger UI:
http://localhost:8080/swagger-ui.html - OpenAPI JSON:
http://localhost:8080/v3/api-docs
src/main/java/com/financial
├── controller/
│ └── PaymentController.java
├── dto/
│ └── PaymentRequestDTO.java
├── exception/
│ ├── GlobalExceptionHandler.java
│ ├── InvalidPaymentException.java
│ └── PaymentMethodNotFoundException.java
├── model/
│ └── Payment.java
├── payment/
│ ├── PaymentStrategy.java
│ ├── QRCodeSupport.java
│ └── impl/
│ ├── BoletoPayment.java
│ ├── CreditCardPayment.java
│ └── PixPayment.java
├── repository/
│ └── PaymentRepository.java
└── service/
├── PaymentService.java
└── ReceiptGenerator.java
./mvnw test| Classe | Cobertura |
|---|---|
PaymentServiceTest |
Processamento dos 3 métodos, método desconhecido, mensagem de exceção |
PaymentControllerTest |
200 válido, 400 por campos inválidos, 422 por método não suportado |
PaymentStrategyTest |
Execução das 3 strategies sem erros |
Desenvolvido por Michel Spirlandeli — Inspirado por Clean Architecture, SOLID e boas práticas de engenharia de software com Java.