Exemplo do mesmo CRUD de usuarios das pastas python, dotnet e node, agora implementado em Java com Maven e Spring Boot, mantendo Swagger, persistencia em memoria, testes automatizados e arquitetura Ports and Adapters.
- Java 21+
- Maven Wrapper
- Spring Boot 4.0.3
- Spring Web MVC
- Spring Validation
- Springdoc OpenAPI
- JUnit 5
- Windows com PowerShell
- Java 21 ou superior instalado e configurado no
PATH - Maven Wrapper incluido no projeto (
mvnwemvnw.cmd)
Para validar a instalacao:
java -version
.\mvnw.cmd -versionSe um desses comandos nao funcionar, primeiro ajuste o JAVA_HOME e o PATH da maquina.
Se o mvn -version mostrar Java 17, o build vai falhar com release version 21 not supported. O projeto compila normalmente com Java 21 ou superior.
Exemplo de ajuste so para a sessao atual do PowerShell:
$env:JAVA_HOME = 'C:\Users\felipe.augusto\.jdks\ms-25.0.1'
$env:PATH = "$env:JAVA_HOME\bin;$env:PATH"
.\mvnw.cmd -versionSe o seu ~/.m2/settings.xml corporativo redirecionar tudo com mirrorOf=*, projetos pessoais podem falhar com 401 Unauthorized antes mesmo de baixar o Spring Boot. Nesse caso, use um arquivo de settings separado para este projeto.
Voce pode manter o seu ~/.m2/settings.xml do trabalho como esta para os projetos corporativos. O ponto importante e este:
profilenao resolve esse caso sozinho quando o problema esta emmirrorsmirrorsnosettings.xmlsao globais- com
mirrorOf=*, o Maven redireciona qualquer repositorio para o Nexus corporativo - por isso, mesmo adicionando um profile para Maven Central, o mirror corporativo continua interceptando a resolucao
Para este projeto, a abordagem mais segura e usar um settings separado no comando Maven.
Existe um exemplo em settings-public.xml.example. Para usar localmente:
Copy-Item .\settings-public.xml.example .\settings-public.xml
.\mvnw.cmd -s .\settings-public.xml spring-boot:runO mesmo vale para testes e build:
.\mvnw.cmd -s .\settings-public.xml test
.\mvnw.cmd -s .\settings-public.xml clean packageSe quiser, voce pode ate manter dois modos de uso no mesmo computador:
- corporativo em outros projetos:
mvn ... - pessoal neste projeto:
.\mvnw.cmd -s .\settings-public.xml ...
Estrutura do projeto:
src/main/java/com/modelos/usuarios
|-- adapters
| |-- inbound/http
| `-- outbound/repositories
|-- application
| `-- services
|-- domain
| `-- ports
`-- UsuariosApiApplication.java
src/test/java/com/modelos/usuarios
|-- api
`-- application
Responsabilidades:
domain: entidade, erros e porta do repositorioapplication: comando de entrada e servico de negocioadapters/outbound: persistencia em memoriaadapters/inbound/http: controllers e contratos HTTPUsuariosApiApplication: bootstrap da aplicacao Spring Boot
id: intnome: stringdtNascimento: datestatus: booltelefones: string[]
Na pasta java:
.\mvnw.cmd -s .\settings-public.xml test.\mvnw.cmd -s .\settings-public.xml spring-boot:run- API:
http://localhost:8080 - Swagger UI:
http://localhost:8080/docs - OpenAPI JSON:
http://localhost:8080/openapi
.\mvnw.cmd -s .\settings-public.xml clean package
java -jar .\target\usuarios-api-java-0.1.0.jar.\mvnw.cmd -s .\settings-public.xml testO CI tambem executa ./mvnw -B verify.
GET /health/liveGET /health/readyPOST /usuariosGET /usuariosGET /usuarios/{usuarioId}PUT /usuarios/{usuarioId}DELETE /usuarios/{usuarioId}
{
"id": 1,
"nome": "Carlos",
"dtNascimento": "1992-03-14",
"status": true,
"telefones": [
"11911112222",
"1122223333"
]
}O workflow fica em .github/workflows/ci.yml e executa:
- setup do Java 21
- cache Maven
./mvnw -B verify
- A persistencia e totalmente em memoria.
- Ao reiniciar a aplicacao, os dados sao perdidos.
- O endpoint
/health/readyretorna503se o servico principal nao estiver disponivel.
.\mvnw.cmd -s .\settings-public.xml test
.\mvnw.cmd -s .\settings-public.xml spring-boot:run
.\mvnw.cmd -s .\settings-public.xml clean package