Skip to content

Result Handlers

Result handlers control how return values from endpoint methods are written to the HTTP response. By default, String values are handled — register custom handlers for other types.

Default Handlers

The following types are handled out of the box:

Return TypeBehavior
StringWritten via ctx.result(value)
Unit (Kotlin)No action
void / VoidNo action

Custom Result Handlers

Register handlers for custom return types:

kotlin
config.routes(Annotated) {
    registerResultHandler<User> { ctx, user ->
        ctx.json(user)
    }
    registerEndpoints(UserEndpoints())
}
java
AnnotatedRouting.install(config, routing -> {
    routing.registerResultHandler(User.class, (ctx, user) -> {
        ctx.json(user);
    });
    routing.registerEndpoints(new UserEndpoints());
});

Now endpoint methods can return User directly:

java
@Get("/users/{id}")
User getUser(@Param int id) {
    return userService.findById(id);
}

Multiple Result Handlers

Register handlers for different types:

kotlin
config.routes(Annotated) {
    registerResultHandler<User> { ctx, user ->
        ctx.json(user)
    }
    registerResultHandler<ByteArray> { ctx, bytes ->
        ctx.result(bytes)
    }
    registerResultHandler<Map<*, *>> { ctx, map ->
        ctx.json(map)
    }
    registerEndpoints(UserEndpoints())
}

HandlerResultConsumer

The HandlerResultConsumer functional interface accepts a Context and the return value:

kotlin
fun interface HandlerResultConsumer<T> {
    fun handle(ctx: Context, value: T)
}

Released under the Apache 2.0 License.