freshcrate
Skin:/
Home > Infrastructure > avaje-http

avaje-http

Controller generation for Javalin, Helidon SE.

Why this rank:Strong adoptionRecent releaseHealthy release cadence

Description

Controller generation for Javalin, Helidon SE.

README

Discord Build Maven Central javadoc javadoc License

HTTP server and client libraries via code generation.

A light (~80kb) wrapper to the JDK 11+ Java Http Client. Additionally, you can create Feign-style interfaces and have implementations generated via annotation processing.

  • Fluid API for building URLs and payload
  • JSON marshaling using Avaje Jsonb/Jackson/Gson
  • Light Feign-style interfaces via annotation processing.
  • Request/Response Interception
  • Authorization via Basic Auth or OAuth Bearer Tokens
  • Async and sync API

Use source code generation to adapt annotated REST controllers @Path, @Get, @Post, etc to Javalin, Helidon SE, and similar web routing HTTP servers.

  • Lightweight (65Kb library + generated source code)
  • Reflection free jax-rs style controllers
  • Supports full use of underlying Javalin or Helidon SE constructs as desired
  • Bean Validation of request bodies (validation groups supported as well)

Add dependencies

<dependency>
  <groupId>io.avaje</groupId>
  <artifactId>avaje-http-api</artifactId>
  <version>${avaje.http.version}</version>
</dependency>

Add the generator module for your desired microframework as an annotation processor.

<!-- Annotation processors -->
<dependency>
  <groupId>io.avaje</groupId>
  <artifactId>avaje-http-{jex/javalin/helidon/vertx}-generator</artifactId>
  <version>${avaje.http.version}</version>
  <scope>provided</scope>
</dependency>

JDK 23+

In JDK 23+, annotation processors are disabled by default, you will need to add a flag to re-enable.

<properties>
  <maven.compiler.proc>full</maven.compiler.proc>
</properties>

Define a Controller (These APT processors work with both Java and Kotlin)

package org.example.hello;

import io.avaje.http.api.Controller;
import io.avaje.http.api.Get;
import java.util.List;

@Controller("/widgets")
public class WidgetController {
  private final HelloComponent hello;
  public WidgetController(HelloComponent hello) {
    this.hello = hello;
  }

  @Get("/{id}")
  Widget getById(int id) {
    return new Widget(id, "you got it"+ hello.hello());
  }

  @Get()
  List<Widget> getAll() {
    return List.of(new Widget(1, "Rob"), new Widget(2, "Fi"));
  }

  record Widget(int id, String name){};
}

DI Usage

The annotation processor will generate controller adapters to register routes to Javalin, Helidon, or Vert.x. The natural way to use the generated adapters is to get a DI library to find and wire them. The AP will automatically detect the presence of avaje-inject and generate the class to use avaje-inject's @Component as the DI annotation.

There isn't a hard requirement to use Avaje for dependency injection. In the absence of avaje-inject, the generated class will use @jakarta.inject.Singleton or @javax.inject.Singleton depending on what's on the classpath. Any DI library that can find and wire the generated @Singleton beans can be used. You can even use Dagger2 or Guice to wire the controllers if you so desire.

To force the AP to generate with @javax.inject.Singleton(in the case where you have both jakarta and javax on the classpath), use the compiler arg -AuseJavax=true

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <compilerArgs>
      <arg>-AuseJavax=true</arg>
    </compilerArgs>
  </configuration>
</plugin>

Usage with Javalin

The annotation processor will generate controller classes implementing the AvajeJavalinPlugin interface, which we can register in javalin using:

List<AvajeJavalinPlugin> routes = ...; //retrieve using a DI framework

Javalin.create(cfg -> routes.forEach(cfg::registerPlugin)).start();

Usage with Helidon SE (4.x)

The annotation processor will generate controller classes implementing the Helidon HttpFeature interface, which we can register with the Helidon HttpRouting.

List<HttpFeature> routes = ... //retrieve using a DI framework
final var builder = HttpRouting.builder();

routes.forEach(builder::addFeature);

WebServer.builder()
         .addRouting(builder)
         .build()
         .start();

Usage with Vert.x

Add the Vert.x runtime API dependency:

<dependency>
  <groupId>io.avaje</groupId>
  <artifactId>avaje-http-api-vertx</artifactId>
  <version>${avaje.http.version}</version>
</dependency>

The annotation processor will generate controller classes implementing VertxRouteSet, which can be registered with io.vertx.ext.web.Router.

List<io.avaje.http.api.vertx.VertxRouteSet> routes = ... //retrieve using a DI framework
Router router = ...;

routes.forEach(route -> route.register(router));

Generated sources

(Javalin) The generated WidgetController$Route.java is:

@Generated("avaje-javalin-generator")
@Singleton
public final class WidgetController$Route extends AvajeJavalinPlugin {

  private final WidgetController controller;

  public WidgetController$Route(WidgetController controller) {
    this.controller = controller;
  }

  @Override
  public void onStart(JavalinState state) {
    routes(state.routes);
  }

  private void routes(RoutesConfig app) {

    app.get("/widgets/{id}", ctx -> {
      ctx.status(200);
      var id = asInt(ctx.pathParam("id"));
      var result = controller.getById(id);
      ctx.json(result);
    });

    app.get("/widgets", ctx -> {
      ctx.status(200);
      var result = controller.getAll();
      ctx.json(result);
    });

  }
}

(Helidon SE) The generated WidgetController$Route.java is:

@Generated("avaje-helidon-generator")
@Component
public final class WidgetController$Route implements HttpFeature {

  private final WidgetController controller;

  public WidgetController$Route(WidgetController controller) {
    this.controller = controller;
  }

  @Override
  public void setup(HttpRouting.Builder routing) {
    routing.get("/widgets/{id}", this::_getById);
    routing.get("/widgets", this::_getAll);
  }

  private void _getById(ServerRequest req, ServerResponse res) throws Exception {
    res.status(OK_200);
    var pathParams = req.path().pathParameters();
    var id = asInt(pathParams.contains("id") ? pathParams.get("id") : null);
    var result = controller.getById(id);
    if (result == null) {
      res.status(NO_CONTENT_204).send();
    } else {
      res.send(result);
    }
  }

  private void _getAll(ServerRequest req, ServerResponse res) throws Exception {
    res.status(OK_200);
    var result = controller.getAll();
    if (result == null) {
      res.status(NO_CONTENT_204).send();
    } else {
      res.send(result);
    }
  }

}

(Vert.x) The generated WidgetController$Route.java is:

@Generated("avaje-vertx-generator")
@Component
public final class WidgetController$Route implements VertxRouteSet {

  private final WidgetController controller;

  public WidgetController$Route(WidgetController controller) {
    this.controller = controller;
  }

  @Override
  public void register(Router router) {

    var routes = router;
    {
      var route = routes.get("/widgets/:id");
      route.handler(ctx -> {
      try {
        ctx.response().setStatusCode(200);
        var id = asInt(ctx.pathParam("id"));
        var result = controller.getById(id);
          if (result == null || ctx.response().ended()) {
            return;
          }
        ctx.response().putHeader("content-type", "application/json");
        ctx.response().end(Json.encode(result));
      } catch (Exception e) {
        ctx.fail(e);
      }
      });
    }
    {
      var route = routes.get("/widgets");
      route.handler(ctx -> {
      try {
        ctx.response().setStatusCode(200);
        var result = controller.getAll();
          if (result == null || ctx.response().ended()) {
            return;
          }
        ctx.response().putHeader("content-type", "application/json");
        ctx.response().end(Json.encode(result));
      } catch (Exception e) {
        ctx.fail(e);
      }
      });
    }
  }
}

Generated sources (Avaje-Jsonb)

If Avaje-Jsonb is detected, http generators with support will use it for faster Json message processing.

(Javalin) The generated WidgetController$Route.java is:

@Generated("avaje-javalin-generator")
@Component
public final class WidgetController$Route extends AvajeJavalinPlugin {

  private final WidgetController controller;
  private final JsonType<List<Widget>> listWidgetJsonType;
  private final JsonType<Widget> widgetJsonType;

  public WidgetController$Route(WidgetController controller, Jsonb jsonb) {
    this.controller = controller;
    this.listWidgetJsonType = jsonb.type(Types.newParameterizedType(List.class, Widget.class));
    this.widgetJsonType = jsonb.type(Widget.class);
  }

  @Override
  public void onStart(JavalinState state) {
    routes(state.routes);
  }

  private void routes(RoutesConfig app) {

    app.get("/widgets/{id}", ctx -> {
      ctx.status(200);
      var id = asInt(ctx.pathParam("id"));
      var result = controller.getById(id);
      widgetJsonType.toJson(result, ctx.contentType("application/json").res().getOutputStream());
    });

    app.get("/widgets", ctx -> {
      ctx.status(200);
      var result = controller.getAll();
      listWidgetJsonType.toJson(result, ctx.contentType("application/json").res().getOutputStream());
    });

  }
}

(Helidon SE) The generated WidgetController$Route.java is:

@Generated("avaje-helidon-generator")
@Component
public final class WidgetController$Route implements HttpFeature {

  private final WidgetController controller;
  private final JsonType<WidgetController.Widget> widgetController$WidgetJsonType;
  private final JsonType<List<WidgetController.Widget>> listWidgetController$WidgetJsonType;

  public WidgetController$Route(WidgetController controller, Jsonb jsonb) {
    this.controller = controller;
    this.widgetController$WidgetJsonType = jsonb.type(WidgetController.Widget.class);
    this.listWidgetController$WidgetJsonType = jsonb.type(Types.newParameterizedType(List.class, WidgetController.Widget.class));
  }

  @Override
  public void setup(HttpRouting.Builder routing) {
    routing.get("/widgets/{id}", this::_getById);
    routing.get("/widgets", this::_getAll);
  }

  private void _getById(ServerRequest req, ServerResponse res) throws Exception {
    res.status(OK_200);
    var pathParams = req.path().pathParameters();
    var id = asInt(pathParams.contains("id") ? pathParams.get("id") : null);
    var result = controller.getById(id);
    if (result == null) {
      res.status(NO_CONTENT_204).send();
    } else {
      res.headers().contentType(MediaTypes.APPLICATION_JSON);
      //jsonb has a special accommodation for helidon to improve performance
      widgetController$WidgetJsonType.toJson(result, JsonOutput.of(res));
    }
  }

  private void _getAll(ServerRequest req, ServerResponse res) throws Exception {
    res.status(OK_200);
    var result = controller.getAll();
    if (result == null) {
      res.status(NO_CONTENT_204).send();
    } else {
      res.headers().contentType(MediaTypes.APPLICATION_JSON);
      listWidgetController$WidgetJsonType.toJson(result, JsonOutput.of(res));
    }
  }

}

(Vert.x) The generated WidgetController$Route.java is:

@Generated("avaje-vertx-generator")
@Component
public final class WidgetController$Route implements VertxRouteSet {

  private final WidgetController controller;
  private final JsonType<List<Widget>> listWidgetJsonType;
  private final JsonType<Widget> widgetJsonType;

  public WidgetController$Route(WidgetController controller, Jsonb jsonb) {
    this.controller = controller;
    this.listWidgetJsonType = jsonb.type(Types.newParameterizedType(List.class, Widget.class));
    this.widgetJsonType = jsonb.type(Widget.class);
  }

  @Override
  public void register(Router router) {

    var routes = router;

    {
      var route = routes.get("/widgets/:id");
      route.handler(ctx -> {
      try {
        ctx.response().setStatusCode(200);
        var id = asInt(ctx.pathParam("id"));
        var result = controller.getById(id);
          if (result == null || ctx.response().ended()) {
            return;
          }
        ctx.response().putHeader("content-type", "application/json");
        ctx.response().end(Buffer.buffer(widgetJsonType.toJsonBytes(result)));
      } catch (Exception e) {
        ctx.fail(e);
      }
      });
    }

    {
      var route = routes.get("/widgets");
      route.handler(ctx -> {
      try {
        ctx.response().setStatusCode(200);
        var result = controller.getAll();
          if (result == null || ctx.response().ended()) {
            return;
          }
        ctx.response().putHeader("content-type", "application/json");
        ctx.response().end(Buffer.buffer(listWidgetJsonType.toJsonBytes(result)));
      } catch (Exception e) {
        ctx.fail(e);
      }
      });
    }
  }
}

Release History

VersionChangesUrgencyDate
3.9## What's Changed * [Client] Fix Async Headers by @SentryMan in https://github.com/avaje/avaje-http/pull/757 * Add `@Body` to resolve ambiguous scalar/collection parameter inferencâ€Ļ by @rbygrave in https://github.com/avaje/avaje-http/pull/762 * Generate $RequestFactory in avaje-http for request-scoped controllers by @rbygrave in https://github.com/avaje/avaje-http/pull/763 * Make an enum object part of the component schema so it can be reused across different endpoints. by @Tijs-2 in httpsHigh6/2/2026
3.8## New Server Added Avaje Http now supports generating Vertx adapters. ## What's Changed * Tag fix by @SentryMan in https://github.com/avaje/avaje-http/pull/720 * [Helidon] Support 204 NO_CONTENT response (with needing ServerResponse) by @rbygrave in https://github.com/avaje/avaje-http/pull/721 * Merge multiple OpenAPI definitions by @cbarlin in https://github.com/avaje/avaje-http/pull/708 * Add OpenAPI Optional, Stream support by @cbarlin in https://github.com/avaje/avaje-http/pullMedium4/1/2026
3.7## What's Changed * Minimise types registered with avaje-inject for generated Routers by @rbygrave in https://github.com/avaje/avaje-http/pull/690 * Conditionally add BeanTypes annotation in ControllerWriter by @SentryMan in https://github.com/avaje/avaje-http/pull/691 * Jackson 3 by @SentryMan in https://github.com/avaje/avaje-http/pull/695 * Mark the plugin as thread-safe by @cbarlin in https://github.com/avaje/avaje-http/pull/700 * Fix controller level duplicate tags by @SentryMan in hLow1/17/2026
3.6## What's Changed * Throw an exception if trying to send a request on a closed client by @SentryMan in https://github.com/avaje/avaje-http/pull/656 * Bump the dependencies group with 12 updates by @dependabot[bot] in https://github.com/avaje/avaje-http/pull/657 * Bump the dependencies group with 5 updates by @dependabot[bot] in https://github.com/avaje/avaje-http/pull/658 * Fix the version property name by @andponlin in https://github.com/avaje/avaje-http/pull/659 * Bump ch.qos.logback:logbLow12/9/2025
3.5## What's Changed * Support Jex Request Scope controllers by @SentryMan in https://github.com/avaje/avaje-http/pull/631 * [Client] Fix Nested Map Generation by @SentryMan in https://github.com/avaje/avaje-http/pull/635 * [client] Add SuppressLogging Annotation by @SentryMan in https://github.com/avaje/avaje-http/pull/637 * Fix SuppressLogging Typo by @SentryMan in https://github.com/avaje/avaje-http/pull/638 * [client] Update Javadocs by @SentryMan in https://github.com/avaje/avaje-http/pulLow10/21/2025
3.4## What's Changed * [client] support custom classloader by @rbygrave in https://github.com/avaje/avaje-http/pull/607 * [client] add descriptive error msg by @SentryMan in https://github.com/avaje/avaje-http/pull/609 * [helidon] Bug fix for list of query parameters or form parameters when parameters is empty by @rbygrave in https://github.com/avaje/avaje-http/pull/610 * [http-client] combine generated consecutive path literals by @SentryMan in https://github.com/avaje/avaje-http/pull/617 * [Low7/24/2025
3.3## What's Changed * Support background token refresh when using AuthTokenProvider by @rbygrave in https://github.com/avaje/avaje-http/pull/592 * Fix error handler controllers failing test-compilation by @SentryMan in https://github.com/avaje/avaje-http/pull/593 * Fix Helidon path openapi generation by @SentryMan in https://github.com/avaje/avaje-http/pull/596 * Fix generated openapi.json parameter names by @rbygrave in https://github.com/avaje/avaje-http/pull/600 **Full Changelog**: hLow4/29/2025
3.2## What's Changed * Add compiler error for GET json bodies by @SentryMan in https://github.com/avaje/avaje-http/pull/581 * Improve the compile error message when we think @BeanParam is needed by @rbygrave in https://github.com/avaje/avaje-http/pull/582 * Bump the dependencies group with 9 updates by @dependabot in https://github.com/avaje/avaje-http/pull/583 * Generate Test Clients during test compilation by @SentryMan in https://github.com/avaje/avaje-http/pull/585 * [jex generation] RootLow3/30/2025
3.1## What's Changed * Add Native JStachio support by @SentryMan in https://github.com/avaje/avaje-http/pull/567 * [Jex Generator] Use optimized Jex jsonb method by @SentryMan in https://github.com/avaje/avaje-http/pull/568 * [generators] Remove jsonb generation if no jsontypes available by @SentryMan in https://github.com/avaje/avaje-http/pull/569 * [sigma-generator] add jstachio support by @SentryMan in https://github.com/avaje/avaje-http/pull/571 * openapi.json - add reading operationId froLow3/18/2025
3.0## Breaking changes * [Http-Client] now uses virtual thread executor by default when using JDK 21+ * [Http-Client] Rename @Client.Import(types=...) to @Client.Import(value=...) * Jsonb controller generation updated for Jsonb 3.0 * Jex Generation overhauled for jex 3.0 ## What's Changed * Generated $Route classes as final by @rbygrave in https://github.com/avaje/avaje-http/pull/524 * [Sigma-Generator] Filter Chain by @SentryMan in https://github.com/avaje/avaje-http/pull/526 * [heliLow2/10/2025
2.8## What's Changed * htmx: Initial add of htmx-api, htmx-nima request support and initial example by @rbygrave in https://github.com/avaje/avaje-http/pull/435 * Add htmx content cache feature by @rbygrave in https://github.com/avaje/avaje-http/pull/484 * Use Non-Deprecated Inject Plugin by @SentryMan in https://github.com/avaje/avaje-http/pull/491 * Update Dependabot Grouping by @SentryMan in https://github.com/avaje/avaje-http/pull/493 * Add Sigma Lambda Generator by @SentryMan in https:/Low11/26/2024
2.7## What's Changed * Bump junit.version from 5.10.2 to 5.10.3 by @dependabot in https://github.com/avaje/avaje-http/pull/459 * Bump io.avaje:avaje-jsonb from 1.11 to 1.12 by @dependabot in https://github.com/avaje/avaje-http/pull/461 * Bump io.avaje:avaje-jsonb-generator from 1.11 to 1.12 by @dependabot in https://github.com/avaje/avaje-http/pull/462 * Bump io.rest-assured:rest-assured from 5.4.0 to 5.5.0 by @dependabot in https://github.com/avaje/avaje-http/pull/463 * Bump com.fasterxml.jacLow7/10/2024
2.6## What's Changed * Bump com.google.code.gson:gson from 2.10.1 to 2.11.0 by @dependabot in https://github.com/avaje/avaje-http/pull/438 * Bump swagger.version from 2.2.21 to 2.2.22 by @dependabot in https://github.com/avaje/avaje-http/pull/437 * [http-client] Fix BeanParam on Eclipse by @SentryMan in https://github.com/avaje/avaje-http/pull/436 * Bump jakarta.validation:jakarta.validation-api from 3.0.2 to 3.1.0 by @dependabot in https://github.com/avaje/avaje-http/pull/440 * Bump org.asserLow7/10/2024
2.5## What's Changed * Bump io.avaje:avaje-jsonb-generator from 1.10 to 1.11 by @dependabot in https://github.com/avaje/avaje-http/pull/417 * Bump avaje-inject.version from 9.11 to 9.12 by @dependabot in https://github.com/avaje/avaje-http/pull/418 * Bump io.avaje:avaje-jsonb from 1.10 to 1.11 by @dependabot in https://github.com/avaje/avaje-http/pull/419 * [workflow]: Bump actions/checkout from 3 to 4 by @dependabot in https://github.com/avaje/avaje-http/pull/421 * [workflow]: Bump actions/caLow7/10/2024
2.4## What's Changed * Support the Avaje Build Plugin by @SentryMan in https://github.com/avaje/avaje-http/pull/397 * Bump parent pom and avaje junit by @rbygrave in https://github.com/avaje/avaje-http/pull/416 **Full Changelog**: https://github.com/avaje/avaje-http/compare/2.3...2.4Low4/9/2024
2.3## What's Changed * Javadoc badges by @SentryMan in https://github.com/avaje/avaje-http/pull/393 * [helidon-generator] Fix Nested Types in other packages by @SentryMan in https://github.com/avaje/avaje-http/pull/399 * [http-client] Add `@Headers` Annotation by @SentryMan in https://github.com/avaje/avaje-http/pull/402 * Can now read record Javadocs for OpenApi by @SentryMan in https://github.com/avaje/avaje-http/pull/412 * Support Byte-Buddy / Mockito with JDK 23 via -Dnet.bytebuddy.experimLow4/9/2024
2.2## What's Changed * Remove `jdk.crypto.ec` by @SentryMan in https://github.com/avaje/avaje-http/pull/385 * Support Helidon Path Variable Patterns by @SentryMan in https://github.com/avaje/avaje-http/pull/387 ## Dependencies * Bump io.javalin:javalin from 6.0.0 to 6.0.1 by @dependabot in https://github.com/avaje/avaje-http/pull/382 * Bump junit.version from 5.10.1 to 5.10.2 by @dependabot in https://github.com/avaje/avaje-http/pull/381 * Bump org.assertj:assertj-core from 3.25.2 to 3.2Low2/20/2024
2.1## What's Changed * Javalin 6-beta Support by @SentryMan in https://github.com/avaje/avaje-http/pull/341 * Javadoc for AvajeJavalinPlugin and tidy javalin ControllerWriter only by @rob-bygrave in https://github.com/avaje/avaje-http/pull/342 * Test Javalin 6 `beta.2` by @SentryMan in https://github.com/avaje/avaje-http/pull/346 * [http-core] Handle `@param` Newlines in Javadoc Reader by @SentryMan in https://github.com/avaje/avaje-http/pull/351 * Fix #354 - Add toEnum() to PathTypeConversionLow1/30/2024
2.0## What's Changed * [HttpClient] Remove deprecated HttpClientContext, migrate to HttpClient by @rob-bygrave in https://github.com/avaje/avaje-http/pull/227 * [Http Api] Remove deprecated instrumentRequestContext() by @SentryMan in https://github.com/avaje/avaje-http/pull/228 * Deprecate the old reactive Helidon, effectively replaced by Nima going forward by @rbygrave in https://github.com/avaje/avaje-http/pull/238 * Rename Nima Generator by @SentryMan in https://github.com/avaje/avaje-http/pLow10/24/2023
1.46## What's Changed * Nima M1 Tests by @SentryMan in https://github.com/avaje/avaje-http/pull/235 * Nima - When returning JSON as String assume the string is raw json by @rbygrave in https://github.com/avaje/avaje-http/pull/236 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.45...1.46Low7/21/2023
1.45## What's Changed * (nima-generator) Support `InputStream` Return Types by @SentryMan in https://github.com/avaje/avaje-http/pull/233 * Add Accept Language header to validation by @SentryMan in https://github.com/avaje/avaje-http/pull/234 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.44...1.45Low7/13/2023
1.44## What's Changed * Fix Jsonb Controller for modular projects without compiler plugin by @SentryMan in https://github.com/avaje/avaje-http/pull/231 * Update Trim Annotation Logic by @SentryMan in https://github.com/avaje/avaje-http/pull/232 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.43...1.44Low7/10/2023
1.43## What's Changed * (Javalin Jsonb) Add support for disableDirectWrites to NOT write directly to Jetty HttpOutput Stream by @SentryMan in https://github.com/avaje/avaje-http/pull/230 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.42...1.43Low6/25/2023
1.40## What's Changed * Change how Generated Clients are registered. by @SentryMan in https://github.com/avaje/avaje-http/pull/218 * Format, javadoc, remove duplicate code by @rbygrave in https://github.com/avaje/avaje-http/pull/219 * Bump to Java version 20 for Nima generator by @rbygrave in https://github.com/avaje/avaje-http/pull/220 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.39...1.40Low6/19/2023
1.41## What's Changed * Fix Enum Path Parsing by @SentryMan in https://github.com/avaje/avaje-http/pull/222 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.40...1.41Low6/19/2023
1.42## What's Changed * Update the tests to use HttpClient (from HttpClientContext) by @rob-bygrave in https://github.com/avaje/avaje-http/pull/224 * Remove inject from quickstart by @SentryMan in https://github.com/avaje/avaje-http/pull/225 * [HttpClient] Remove deprecated method withHandler() migrate to handler() by @rob-bygrave in https://github.com/avaje/avaje-http/pull/226 * Extendable Clients by @SentryMan in https://github.com/avaje/avaje-http/pull/229 ## New Contributors * @rob-bygraLow6/19/2023
1.39## What's Changed * InstrumentServerContext annotation by @SentryMan in https://github.com/avaje/avaje-http/pull/214 * Don't serialize twice when Javalin Context is already committed by @SentryMan in https://github.com/avaje/avaje-http/pull/211 * [http-client] Copy Annotations to Generated Clients by @SentryMan in https://github.com/avaje/avaje-http/pull/216 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.38...1.39Low4/30/2023
1.38## What's Changed * Fix Hard Inject Dependency (use cyclical plugin module) by @SentryMan in https://github.com/avaje/avaje-http/pull/212 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.37...1.38Low4/30/2023
1.37## What's Changed * Fix BeanParam imports by @SentryMan in https://github.com/avaje/avaje-http/pull/209 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.36...1.37Low4/30/2023
1.36## What's Changed * [http client] Support VarArg interceptors for HttpClient by @SentryMan in https://github.com/avaje/avaje-http/pull/203 * Add RequestContextResolver Feature by @SentryMan in https://github.com/avaje/avaje-http/pull/204 * [http client] Expose UrlBuilder url() method on client by @rbygrave in https://github.com/avaje/avaje-http/pull/205 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.35...1.36Low4/18/2023
1.35## What's Changed * [http client] Use more generic Type rather than ParameterizedType by @SentryMan in https://github.com/avaje/avaje-http/pull/194 * [http client] Change Async API to use more generic Type instead of ParameterizedType by @SentryMan in https://github.com/avaje/avaje-http/pull/199 * Add io.avaje.http.api `@Valid` Annotation to support custom validators by @SentryMan in https://github.com/avaje/avaje-http/pull/195 * [Javalin] Use Context#bodyStreamAsClass(...) by @Mechite in hLow4/5/2023
1.34## What's Changed * Fix #188 - IllegalAccessError io.avaje.http.generator.core.openapi.KnownTypes ... does not read module java.sql by @rbygrave in https://github.com/avaje/avaje-http/pull/190 * Nima JsonB Stream by @SentryMan in https://github.com/avaje/avaje-http/pull/191 * Remove Compiler Plugin from quick start by @SentryMan in https://github.com/avaje/avaje-http/pull/192 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.33...1.34Low4/2/2023
1.33## What's Changed * Fix Bean Param Enum Imports by @SentryMan in https://github.com/avaje/avaje-http/pull/187 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.32...1.33Low4/2/2023
1.32## What's Changed * (Http-Client) Support Jsonb SubTypes in request body by @SentryMan in https://github.com/avaje/avaje-http/pull/180 * Improve Javadoc only by @rbygrave in https://github.com/avaje/avaje-http/pull/181 * (Client) Support Generic Body Type by @SentryMan in https://github.com/avaje/avaje-http/pull/182 * ThreadLocal Context by @SentryMan in https://github.com/avaje/avaje-http/pull/183 * Fix collection query mapping by @SentryMan in https://github.com/avaje/avaje-http/pull/184 Low3/17/2023
1.30## What's Changed * Support InputStream/byte[] Body Types by @SentryMan in https://github.com/avaje/avaje-http/pull/176 * OpenAPI documents support enumeration types by @kevin70 in https://github.com/avaje/avaje-http/pull/177 * BeanParam OpenAPI by @SentryMan in https://github.com/avaje/avaje-http/pull/179 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.29...1.30Low3/10/2023
1.29## What's Changed * fix client processor overriding OpenAPI by @SentryMan in https://github.com/avaje/avaje-http/pull/175 **Full Changelog**: https://github.com/avaje/avaje-http/compare/1.28...1.29Low3/7/2023
1.28## What's Changed * OpenAPI uses javadoc for fields by @kevin70 in https://github.com/avaje/avaje-http/pull/162 * Use Prisms 1.4 by @SentryMan in https://github.com/avaje/avaje-http/pull/165 * support @SecurityScheme/Fix OpenAPI Serializer by @SentryMan in https://github.com/avaje/avaje-http/pull/164 * Support Enum Query/Form Parameters by @SentryMan in https://github.com/avaje/avaje-http/pull/166 * Add Request Timeout Annotation by @SentryMan in https://github.com/avaje/avaje-http/pull/168Low3/3/2023
avaje-http-parent-1.27## What's Changed * #158: Fix CompletableFuture jsonb generation by @LoonyRules in https://github.com/avaje/avaje-http/pull/160 **Full Changelog**: https://github.com/avaje/avaje-http/compare/avaje-http-parent-1.26...avaje-http-parent-1.27Low2/14/2023
avaje-http-parent-1.26## What's Changed * Inherit interface roles and class openAPIResponse by @SentryMan in https://github.com/avaje/avaje-http/pull/152 * http version in test parent pom by @SentryMan in https://github.com/avaje/avaje-http/pull/153 * Use Prisms instead of using annotations directly by @SentryMan in https://github.com/avaje/avaje-http/pull/155 * Support Javalin async request handling [Context#future(...)] by @LoonyRules in https://github.com/avaje/avaje-http/pull/156 ## New Contributors * @LoLow2/12/2023
avaje-http-parent-1.25## What's Changed * Fix Role short names by @SentryMan in https://github.com/avaje/avaje-http/pull/151 **Full Changelog**: https://github.com/avaje/avaje-http/compare/avaje-http-parent-1.24...avaje-http-parent-1.25Low2/2/2023
avaje-http-parent-1.24## What's Changed * Fix such that Class Roles are added to Method Roles by @SentryMan in https://github.com/avaje/avaje-http/pull/148 * Lengthen Inner Type Short Names by @SentryMan in https://github.com/avaje/avaje-http/pull/149 * Now can override default status code with @Produces by @SentryMan in https://github.com/avaje/avaje-http/pull/150 **Full Changelog**: https://github.com/avaje/avaje-http/compare/avaje-http-parent-1.23...avaje-http-parent-1.24Low2/2/2023
avaje-http-parent-1.23## What's Changed * Now can define path in `@Controller` by @SentryMan in https://github.com/avaje/avaje-http/pull/123 * Fix Annotations when using JsonB by @SentryMan in https://github.com/avaje/avaje-http/pull/125 * Make Class level @Roles Inheritable. by @SentryMan in https://github.com/avaje/avaje-http/pull/126 * Flatten module structure by @rbygrave in https://github.com/avaje/avaje-http/pull/130 * Can validate request body by @SentryMan in https://github.com/avaje/avaje-http/pull/129 Low2/2/2023
avaje-http-generator-parent-1.22## What's Changed * Fix flag defaulting to Javax Singleton/Add more tests by @SentryMan in https://github.com/avaje/avaje-http/pull/121 **Full Changelog**: https://github.com/avaje/avaje-http/compare/avaje-http-generator-parent-1.21...avaje-http-generator-parent-1.22Low1/10/2023
avaje-http-generator-parent-1.21## What's Changed * Enhance OpenAPI generation by @SentryMan in https://github.com/avaje/avaje-http/pull/115 * Bring the README more in line with the Docs by @SentryMan in https://github.com/avaje/avaje-http/pull/117 * Support generic jsonb types by @SentryMan in https://github.com/avaje/avaje-http/pull/116 * Use @Singleton again by @SentryMan in https://github.com/avaje/avaje-http/pull/118 * Create @MatrixParam Annotation by @SentryMan in https://github.com/avaje/avaje-http/pull/119 * RemLow1/10/2023
avaje-http-generator-parent-1.20## What's Changed * Add support for List/Array Types in client generation by @SentryMan in https://github.com/avaje/avaje-http/pull/114 **Full Changelog**: https://github.com/avaje/avaje-http/compare/avaje-http-generator-parent-1.19...avaje-http-generator-parent-1.20Low12/15/2022
avaje-http-generator-parent-1.19Issues ----------- #105 - Refactor rename internal methods to use accessor style (from getter style) #99 - (Javalin) Avaje JsonB support #98 - (Nima) Fix Header Generation Low10/31/2022
avaje-http-generator-parent-1.18## Adds Helidon Nima support This release adds Helidon Nima support via a `avaje-http-nima-generator`. Likely to be the MVP for avaje-http. Big thanks to @SentryMan for getting the Nima support over the line!!! Issues -------- #88 - Helidon Nima support enhancement #92 - Add more MediaTypes for byte[] responses; #90 - Now get Component Type from Array TypeMirror #89 - Infinite recursion when using Byte Arrays bug #86 - Use Gradle incremental annotation processing #85 - Change to Low10/18/2022
avaje-http-generator-parent-1.17Issues -------- #79 - Bump to Java 11 with module-infoLow5/24/2022
avaje-http-generator-parent-1.16#73 - Fix code generation for Http Client such that provider works in src/test bug #72 - Add support for withDefault() with Jex generation Low5/23/2022
avaje-http-generator-parent-1.12#71 - Support Javalin 4.x slash accepting named paths (rather than splat) #70 - Add support for Jex 2.0 with slash accepting named paths (rather than splat) #67 #68 - Javalin 4 path variable switched from ':param' to '{param}' #69 - Support for Javalin 4.x API Low10/26/2021
avaje-http-generator-parent-1.11#66 - [client api] Support use of @BeanParam #65 - [client api] Bug with @Form @Post with path parameter included as formParam() bug Low10/26/2021

Dependencies & License Audit

Loading dependencies...

Similar Packages

MoLiâš™ī¸ Simplify your projects with MoLi, a fast and flexible Molang interpreter in Java, designed for easy integration and high performance.main@2026-06-06
graphlinkType-safe code generator for GraphQL schemas — produces clients and server interfaces for Dart, Flutter, Java, and Spring Boot. Features built-in caching with TTL/tag-based invalidation, JSOv4.7.1
excalibase-graphqlExcalibase GraphQL instantly turns your database into a GraphQL API. Built with Spring Boot, it supports schema discovery, subscriptions, and type handling — no manual resolvers needed.main@2026-06-04
free-claude-code🚀 Use Claude Code CLI for free with NVIDIA's unlimited API. This proxy converts requests to NIM format and integrates with a Telegram bot for remote control.main@2026-06-01
copilot-api🚀 Access the reverse-engineered GitHub Copilot API through this proxy, enabling streamlined integration for your development needs.main@2026-06-01

More in Infrastructure

tensorzeroTensorZero is an open-source LLMOps platform that unifies an LLM gateway, observability, evaluation, optimization, and experimentation.
planoPlano is an AI-native proxy and data plane for agentic apps — with built-in orchestration, safety, observability, and smart LLM routing so you stay focused on your agents core logic.
modelsThis repository contains comprehensive pricing and configuration data for LLMs. It powers cost attribution for 200+ enterprises running 400B+ tokens through Portkey AI Gateway every day.
edgeeOpen-source AI gateway written in Rust, with token compression for Claude Code, Codex... and any other LLM client.