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 Summary
ConstructorsModifierConstructorDescriptionprotectedProtected no-arg constructor for CDI proxying and frameworks.IdempotencyContainerFilter(IdempotencyRepository repository) Creates a filter with default configuration.IdempotencyContainerFilter(IdempotencyRepository repository, IdempotencyJaxRsConfig config) Creates a filter with custom configuration. -
Method Summary
Modifier and TypeMethodDescriptionvoidaroundWriteTo(jakarta.ws.rs.ext.WriterInterceptorContext context) voidfilter(jakarta.ws.rs.container.ContainerRequestContext requestContext) voidfilter(jakarta.ws.rs.container.ContainerRequestContext requestContext, jakarta.ws.rs.container.ContainerResponseContext responseContext) booleanChecks if this filter instance is configured for name-binding.Marks this filter instance for name-binding viaIdempotent.
-
Constructor Details
-
IdempotencyContainerFilter
protected IdempotencyContainerFilter()Protected no-arg constructor for CDI proxying and frameworks. -
IdempotencyContainerFilter
Creates a filter with default configuration. In CDI / Jakarta EE environments, theIdempotencyRepositoryis injected automatically.- Parameters:
repository- the backing store for idempotency records.
-
IdempotencyContainerFilter
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
Marks this filter instance for name-binding viaIdempotent.- Returns:
- this filter instance for fluent chaining.
-
isNameBinding
public boolean isNameBinding()Checks if this filter instance is configured for name-binding.- Returns:
trueif name-binding is enabled,falseotherwise.
-
filter
public void filter(jakarta.ws.rs.container.ContainerRequestContext requestContext) throws IOException - Specified by:
filterin interfacejakarta.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:
filterin interfacejakarta.ws.rs.container.ContainerResponseFilter- Throws:
IOException
-
aroundWriteTo
- Specified by:
aroundWriteToin interfacejakarta.ws.rs.ext.WriterInterceptor- Throws:
IOException
-