{"id":50721595,"url":"https://github.com/odan/java-minimal-api","last_synced_at":"2026-06-10T00:30:29.331Z","repository":{"id":353880451,"uuid":"1221276081","full_name":"odan/java-minimal-api","owner":"odan","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-04T20:13:52.000Z","size":44,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-04T22:17:33.436Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/odan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-26T01:31:18.000Z","updated_at":"2026-05-04T20:13:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/odan/java-minimal-api","commit_stats":null,"previous_names":["odan/java-minimal-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/odan/java-minimal-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odan%2Fjava-minimal-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odan%2Fjava-minimal-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odan%2Fjava-minimal-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odan%2Fjava-minimal-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/odan","download_url":"https://codeload.github.com/odan/java-minimal-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odan%2Fjava-minimal-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34132030,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-10T00:30:28.613Z","updated_at":"2026-06-10T00:30:29.320Z","avatar_url":"https://github.com/odan.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Minimal API (Javalin + Guice)\r\n\r\nA lightweight Java API using:\r\n\r\n- Java 21\r\n- Javalin (with HTTPS)\r\n- Google Guice (Dependency Injection)\r\n- Typesafe Config \r\n- Maven (Build)\r\n\r\n## Requirements\r\n\r\nInstall:\r\n\r\n- Java 21+\r\n- Maven 3.9+\r\n\r\nCheck versions:\r\n\r\n```bash\r\njava --version\r\nmvn --version\r\n```\r\n\r\n## Project Structure\r\n\r\n```text\r\nsrc/main/java/com/odan\r\n├── Main.java\r\n├── config/\r\n│   ├── AppModule.java\r\n│   └── Configuration.java\r\n├── exception/\r\n│   └── ApiException.java\r\n├── health/\r\n│   └── handler/\r\n│       └── HealthHandler.java\r\n├── routing/\r\n│   └── RouteRegistry.java\r\n└── user/\r\n    ├── domain/\r\n    │   └── User.java\r\n    ├── handler/\r\n    │   └── GetUsersHandler.java\r\n    ├── repository/\r\n    │   └── UserRepository.java\r\n    └── service/\r\n        └── UserService.java\r\n\r\nsrc/main/resources/\r\n└── application.conf\r\n```\r\n\r\n## Architecture\r\n\r\nDependency flow:\r\n\r\n```text\r\nRouteRegistry\r\n  -\u003e Handler\r\n      -\u003e Service\r\n          -\u003e Repository\r\n```\r\n\r\nExample:\r\n\r\n```text\r\n/users\r\n  -\u003e GetUsersHandler\r\n      -\u003e UserService\r\n          -\u003e UserRepository\r\n```\r\n\r\nRoutes are registered centrally in:\r\n\r\n```java\r\ncom.odan.routing.RouteRegistry\r\n```\r\n\r\nExample:\r\n\r\n```java\r\napp.get(\"/users\", ctx -\u003e\r\n    injector.getInstance(GetUsersHandler.class).handle(ctx)\r\n);\r\n```\r\n\r\nHandlers are lazily resolved through Guice when a route is hit.\r\n\r\n## Compile\r\n\r\nCompile sources:\r\n\r\n```bash\r\nmvn compile\r\n```\r\n\r\n## Run (Development)\r\n\r\nRun application:\r\n\r\n```bash\r\nmvn exec:java\r\n```\r\n\r\nDefault server:\r\n\r\n```text\r\nhttp://localhost:8080\r\n```\r\n\r\nTest endpoints:\r\n\r\n```bash\r\ncurl http://localhost:8080/health\r\n```\r\n\r\n```bash\r\ncurl http://localhost:8080/users\r\n```\r\n\r\n## Clean\r\n\r\nRemove generated artifacts:\r\n\r\n```bash\r\nmvn clean\r\n```\r\n\r\n## Build\r\n\r\nCreate jar:\r\n\r\n```bash\r\nmvn package\r\n```\r\n\r\nGenerated file:\r\n\r\n```text\r\ntarget/minimal-api-1.0.0.jar\r\n```\r\n\r\n## Run Built Jar\r\n\r\nIf jar is executable:\r\n\r\n```bash\r\njava -jar target/minimal-api-1.0.0.jar\r\n```\r\n\r\nIf using dependencies outside fat-jar packaging:\r\n\r\n```bash\r\nmvn exec:java -Dapp.env=prod\r\n```\r\n\r\n## Clean + Rebuild\r\n\r\n```bash\r\nmvn clean package\r\n```\r\n\r\n## Run Tests\r\n\r\n```bash\r\nmvn test\r\n```\r\n\r\n## Format Java Files\r\n\r\n```bash\r\nmvn checkstyle:check\r\n```\r\n\r\nVerify formatting (fails build if bad)\r\n\r\n```\r\nmvn spotless:check\r\n```\r\n\r\nAutomatically fix the code\r\n\r\n```\r\nmvn spotless:apply\r\n```\r\n\r\nFix then verify\r\n\r\n```\r\nmvn spotless:apply spotless:check\r\n```\r\n\r\n## Dependency Injection\r\n\r\nGuice bindings:\r\n\r\n```java\r\nbind(GetUsersHandler.class).in(Singleton.class);\r\nbind(UserService.class).in(Singleton.class);\r\nbind(UserRepository.class).in(Singleton.class);\r\n```\r\n\r\nLazy singleton creation:\r\n\r\n- created on first use\r\n- reused afterwards\r\n\r\n## Configuration\r\n\r\nConfiguration files:\r\n\r\n```text\r\nsrc/main/resources/META-INF/*.properties\r\n```\r\n\r\n### Priorities\r\n\r\n1. System Properties (highest priority → wins over everything)\r\n\r\n   Example: `-Dserver.http-port=80`\r\n\r\n2. Environment Variables (wins over .env and config files)\r\n\r\n   Example: `SERVER_HTTP_PORT=80`\r\n\r\n3. `.env` file (wins over config files, but loses against real ENV)\r\n\r\n   Example: `SERVER_HTTP_PORT=80`\r\n\r\n4. microprofile-config-{profile}.properties (wins over default config file)\r\n\r\n   Example: `server.http-port=80`\r\n\r\n5. microprofile-config.properties (lowest priority → overridden by all above)\r\n\r\n   Example: `server.http-port=80`\r\n\r\nNote: `.env` does not override existing system properties.\r\n\r\n\r\n## Useful Maven Commands\r\n\r\nCompile:\r\n\r\n```\r\nmvn compile\r\n```\r\n\r\nRun:\r\n\r\n```\r\nmvn exec:java\r\n```\r\n\r\nTest:\r\n\r\n```\r\nmvn test\r\n```\r\n\r\nClean:\r\n\r\n```\r\nmvn clean\r\n```\r\n\r\nBuild:\r\n\r\n```\r\nmvn package\r\n```\r\n\r\nClean + Build:\r\n\r\n```\r\nmvn clean package\r\n```\r\n\r\nDependency tree:\r\n\r\n```\r\nmvn dependency:tree\r\n```\r\n\r\n## HTTPS certificate\r\n\r\nCreate SSL development certificate\r\n\r\n```\r\nopenssl req -x509 -newkey rsa:4096 -keyout src/main/resources/ssl/key.pem -out src/main/resources/ssl/cert.pem -days 365 -nodes\r\n```\r\n\r\nEnter \"localhost\" for the domain.\r\n\r\n\r\n## Future Extensions\r\n\r\nPossible next steps:\r\n\r\n- Request validation\r\n- JSON serialization config\r\n- Middleware\r\n- Authentication\r\n- Database integration\r\n- OpenAPI/Swagger","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fodan%2Fjava-minimal-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fodan%2Fjava-minimal-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fodan%2Fjava-minimal-api/lists"}