|
| 1 | +# Usuarios API Java |
| 2 | + |
| 3 | +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. |
| 4 | + |
| 5 | +## Tecnologias |
| 6 | + |
| 7 | +- Java 21+ |
| 8 | +- Maven Wrapper |
| 9 | +- Spring Boot 4.0.3 |
| 10 | +- Spring Web MVC |
| 11 | +- Spring Validation |
| 12 | +- Springdoc OpenAPI |
| 13 | +- JUnit 5 |
| 14 | + |
| 15 | +## Pre-requisitos |
| 16 | + |
| 17 | +- Windows com PowerShell |
| 18 | +- Java 21 ou superior instalado e configurado no `PATH` |
| 19 | +- Maven Wrapper incluido no projeto (`mvnw` e `mvnw.cmd`) |
| 20 | + |
| 21 | +Para validar a instalacao: |
| 22 | + |
| 23 | +```powershell |
| 24 | +java -version |
| 25 | +.\mvnw.cmd -version |
| 26 | +``` |
| 27 | + |
| 28 | +Se um desses comandos nao funcionar, primeiro ajuste o `JAVA_HOME` e o `PATH` da maquina. |
| 29 | + |
| 30 | +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. |
| 31 | + |
| 32 | +Exemplo de ajuste so para a sessao atual do PowerShell: |
| 33 | + |
| 34 | +```powershell |
| 35 | +$env:JAVA_HOME = 'C:\Users\felipe.augusto\.jdks\ms-25.0.1' |
| 36 | +$env:PATH = "$env:JAVA_HOME\bin;$env:PATH" |
| 37 | +.\mvnw.cmd -version |
| 38 | +``` |
| 39 | + |
| 40 | +Se 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. |
| 41 | + |
| 42 | +## Settings Maven corporativo x pessoal |
| 43 | + |
| 44 | +Voce pode manter o seu `~/.m2/settings.xml` do trabalho como esta para os projetos corporativos. O ponto importante e este: |
| 45 | + |
| 46 | +- `profile` nao resolve esse caso sozinho quando o problema esta em `mirrors` |
| 47 | +- `mirrors` no `settings.xml` sao globais |
| 48 | +- com `mirrorOf=*`, o Maven redireciona qualquer repositorio para o Nexus corporativo |
| 49 | +- por isso, mesmo adicionando um profile para Maven Central, o mirror corporativo continua interceptando a resolucao |
| 50 | + |
| 51 | +Para este projeto, a abordagem mais segura e usar um settings separado no comando Maven. |
| 52 | + |
| 53 | +Existe um exemplo em `settings-public.xml.example`. Para usar localmente: |
| 54 | + |
| 55 | +```powershell |
| 56 | +Copy-Item .\settings-public.xml.example .\settings-public.xml |
| 57 | +.\mvnw.cmd -s .\settings-public.xml spring-boot:run |
| 58 | +``` |
| 59 | + |
| 60 | +O mesmo vale para testes e build: |
| 61 | + |
| 62 | +```powershell |
| 63 | +.\mvnw.cmd -s .\settings-public.xml test |
| 64 | +.\mvnw.cmd -s .\settings-public.xml clean package |
| 65 | +``` |
| 66 | + |
| 67 | +Se quiser, voce pode ate manter dois modos de uso no mesmo computador: |
| 68 | + |
| 69 | +- corporativo em outros projetos: `mvn ...` |
| 70 | +- pessoal neste projeto: `.\mvnw.cmd -s .\settings-public.xml ...` |
| 71 | + |
| 72 | +## Arquitetura |
| 73 | + |
| 74 | +Estrutura do projeto: |
| 75 | + |
| 76 | +```text |
| 77 | +src/main/java/com/modelos/usuarios |
| 78 | +|-- adapters |
| 79 | +| |-- inbound/http |
| 80 | +| `-- outbound/repositories |
| 81 | +|-- application |
| 82 | +| `-- services |
| 83 | +|-- domain |
| 84 | +| `-- ports |
| 85 | +`-- UsuariosApiApplication.java |
| 86 | +
|
| 87 | +src/test/java/com/modelos/usuarios |
| 88 | +|-- api |
| 89 | +`-- application |
| 90 | +``` |
| 91 | + |
| 92 | +Responsabilidades: |
| 93 | + |
| 94 | +- `domain`: entidade, erros e porta do repositorio |
| 95 | +- `application`: comando de entrada e servico de negocio |
| 96 | +- `adapters/outbound`: persistencia em memoria |
| 97 | +- `adapters/inbound/http`: controllers e contratos HTTP |
| 98 | +- `UsuariosApiApplication`: bootstrap da aplicacao Spring Boot |
| 99 | + |
| 100 | +## Modelo de dominio |
| 101 | + |
| 102 | +- `id: int` |
| 103 | +- `nome: string` |
| 104 | +- `dtNascimento: date` |
| 105 | +- `status: bool` |
| 106 | +- `telefones: string[]` |
| 107 | + |
| 108 | +## Como rodar |
| 109 | + |
| 110 | +Na pasta `java`: |
| 111 | + |
| 112 | +### 1. Rodar os testes |
| 113 | + |
| 114 | +```powershell |
| 115 | +.\mvnw.cmd -s .\settings-public.xml test |
| 116 | +``` |
| 117 | + |
| 118 | +### 2. Subir a API |
| 119 | + |
| 120 | +```powershell |
| 121 | +.\mvnw.cmd -s .\settings-public.xml spring-boot:run |
| 122 | +``` |
| 123 | + |
| 124 | +### 3. Acessar a aplicacao |
| 125 | + |
| 126 | +- API: `http://localhost:8080` |
| 127 | +- Swagger UI: `http://localhost:8080/docs` |
| 128 | +- OpenAPI JSON: `http://localhost:8080/openapi` |
| 129 | + |
| 130 | +### 4. Build empacotado |
| 131 | + |
| 132 | +```powershell |
| 133 | +.\mvnw.cmd -s .\settings-public.xml clean package |
| 134 | +java -jar .\target\usuarios-api-java-0.1.0.jar |
| 135 | +``` |
| 136 | + |
| 137 | +## Como testar |
| 138 | + |
| 139 | +```powershell |
| 140 | +.\mvnw.cmd -s .\settings-public.xml test |
| 141 | +``` |
| 142 | + |
| 143 | +O CI tambem executa `./mvnw -B verify`. |
| 144 | + |
| 145 | +## Endpoints |
| 146 | + |
| 147 | +- `GET /health/live` |
| 148 | +- `GET /health/ready` |
| 149 | +- `POST /usuarios` |
| 150 | +- `GET /usuarios` |
| 151 | +- `GET /usuarios/{usuarioId}` |
| 152 | +- `PUT /usuarios/{usuarioId}` |
| 153 | +- `DELETE /usuarios/{usuarioId}` |
| 154 | + |
| 155 | +## Exemplo de payload |
| 156 | + |
| 157 | +```json |
| 158 | +{ |
| 159 | + "id": 1, |
| 160 | + "nome": "Carlos", |
| 161 | + "dtNascimento": "1992-03-14", |
| 162 | + "status": true, |
| 163 | + "telefones": [ |
| 164 | + "11911112222", |
| 165 | + "1122223333" |
| 166 | + ] |
| 167 | +} |
| 168 | +``` |
| 169 | + |
| 170 | +## CI |
| 171 | + |
| 172 | +O workflow fica em `.github/workflows/ci.yml` e executa: |
| 173 | + |
| 174 | +- setup do Java 21 |
| 175 | +- cache Maven |
| 176 | +- `./mvnw -B verify` |
| 177 | + |
| 178 | +## Observacoes |
| 179 | + |
| 180 | +- A persistencia e totalmente em memoria. |
| 181 | +- Ao reiniciar a aplicacao, os dados sao perdidos. |
| 182 | +- O endpoint `/health/ready` retorna `503` se o servico principal nao estiver disponivel. |
| 183 | + |
| 184 | +## Comandos uteis |
| 185 | + |
| 186 | +```powershell |
| 187 | +.\mvnw.cmd -s .\settings-public.xml test |
| 188 | +.\mvnw.cmd -s .\settings-public.xml spring-boot:run |
| 189 | +.\mvnw.cmd -s .\settings-public.xml clean package |
| 190 | +``` |
0 commit comments