Class IdempotencyContainerFilter

java.lang.Object
io.github.ravocode.avoonce.jaxrs.IdempotencyContainerFilter
All Implemented Interfaces:
jakarta.ws.rs.container.ContainerRequestFilter, jakarta.ws.rs.container.ContainerResponseFilter, jakarta.ws.rs.ext.WriterInterceptor

@Provider @Priority(3000) public class IdempotencyContainerFilter extends Object implements jakarta.ws.rs.container.ContainerRequestFilter, jakarta.ws.rs.container.ContainerResponseFilter, jakarta.ws.rs.ext.WriterInterceptor
JAX-RS ContainerRequestFilter, ContainerResponseFilter, and WriterInterceptor that provides zero-code idempotency protection for any JAX-RS resource.

This filter works with any JAX-RS 3.1+ runtime (Jersey, RESTEasy, CXF, Quarkus). It intercepts requests, validates or acquires idempotency keys, captures the serialized response body via WriterInterceptor, and replays cached responses on retry.

Registration (Jersey example)

IdempotencyRepository repo = new CaffeineIdempotencyRepository(config);
resourceConfig.register(new IdempotencyContainerFilter(repo));

Registration (Quarkus CDI example)

@ApplicationScoped
public class IdempotencyFilterProducer {
    @Produces
    @Singleton
    public IdempotencyContainerFilter idempotencyFilter(IdempotencyRepository repo) {
        return new IdempotencyContainerFilter(repo);
    }
}
See Also:
  • Constructor Details

    • IdempotencyContainerFilter

      protected IdempotencyContainerFilter()
      Protected no-arg constructor for CDI proxying and frameworks.
    • IdempotencyContainerFilter

      @Inject public IdempotencyContainerFilter(IdempotencyRepository repository)
      Creates a filter with default configuration. In CDI / Jakarta EE environments, the IdempotencyRepository is injected automatically.
      Parameters:
      repository - the backing store for idempotency records.
    • IdempotencyContainerFilter

      public IdempotencyContainerFilter(IdempotencyRepository repository, IdempotencyJaxRsConfig config)
      Creates a filter with custom configuration.
      Parameters:
      repository - the backing store for idempotency records.
      config - filter configuration (header name, body hashing, etc.).
  • Method Details

    • withNameBinding

      public IdempotencyContainerFilter withNameBinding()
      Marks this filter instance for name-binding via Idempotent.
      Returns:
      this filter instance for fluent chaining.
    • isNameBinding

      public boolean isNameBinding()
      Checks if this filter instance is configured for name-binding.
      Returns:
      true if name-binding is enabled, false otherwise.
    • filter

      public void filter(jakarta.ws.rs.container.ContainerRequestContext requestContext) throws IOException
      Specified by:
      filter in interface jakarta.ws.rs.container.ContainerRequestFilter
      Throws:
      IOException
    • filter

      public void filter(jakarta.ws.rs.container.ContainerRequestContext requestContext, jakarta.ws.rs.container.ContainerResponseContext responseContext) throws IOException
      Specified by:
      filter in interface jakarta.ws.rs.container.ContainerResponseFilter
      Throws:
      IOException
    • aroundWriteTo

      public void aroundWriteTo(jakarta.ws.rs.ext.WriterInterceptorContext context) throws IOException
      Specified by:
      aroundWriteTo in interface jakarta.ws.rs.ext.WriterInterceptor
      Throws:
      IOException