URL patterns
Java controllers
/services/java/<project>/<class-path>/<route-suffix>
/public/java/<project>/<class-path>/<route-suffix><class-path>is the controller's fully-qualified Java class name with.replaced by/.com.acme.CountryController->com/acme/CountryController.<route-suffix>is the value of the method-level@Get/@Post/ etc. annotation.
Routing rules:
- Longest base-path wins (nested-package controllers shadow their outer namespaces).
- Within a controller, the most specific suffix wins. Literal paths beat
{placeholder}patterns. - Path placeholders compile to named regex groups.
TypeCoercerhandlesString/int/long/UUID/enum/booleanat bind time and surfaces parse failures as400. @Bodydeserializes via Spring's primary JacksonObjectMapper.- Return values:
void-> write yourself;String/CharSequence->text/plain; everything else -> Jackson JSON.
TypeScript / JavaScript controllers
/services/ts/<project>/<file>.ts/<route-suffix>
/services/js/<project>/<file>.{js,mjs}/<route-suffix>The *Controller.ts decorator pattern from @aerokit/sdk/http/decorators builds the equivalent routing table at module load.
OpenAPI aggregation
GET /services/openapiMerges every published OpenAPI fragment - TS controller fragments and Java controller fragments produced by JavaControllerOpenApiPublisher (location java-controller://<project>::<fqn>).
OData
/odata/v2/<service-name>/<entity-set>(<key>)
/odata/v2/<service-name>/$metadataDriven by *.odata artefacts (see /help/artefacts/services/odata).
WebSockets
/websockets/stomp/<endpoint>The <endpoint> segment is the value of the endpoint attribute on @Websocket(...), or the endpoint field of a *.websocket artefact.