Jersey core client implementation for building RESTful web service clients using JAX-RS API
npx @tessl/cli install tessl/maven-org-glassfish-jersey-core--jersey-client@3.1.0Jersey Client is the core client implementation for Jersey, Eclipse's production-quality JAX-RS Reference Implementation for building RESTful web service clients. It provides comprehensive client-side features including request/response processing, entity serialization/deserialization, connector abstractions for different HTTP client implementations, request and response filters for cross-cutting concerns like authentication and logging, async and reactive programming support, and extensive configuration options.
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>3.1.10</version>
</dependency>import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.ClientBuilder;
import jakarta.ws.rs.client.WebTarget;
import jakarta.ws.rs.client.Invocation;
import jakarta.ws.rs.core.Response;
import org.glassfish.jersey.client.JerseyClientBuilder;
import org.glassfish.jersey.client.JerseyClient;import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.WebTarget;
import jakarta.ws.rs.core.Response;
import org.glassfish.jersey.client.JerseyClientBuilder;
// Create a client
Client client = JerseyClientBuilder.createClient();
// Create a web target
WebTarget target = client.target("https://api.example.com");
// Execute a GET request
Response response = target.path("users")
.queryParam("page", 1)
.request()
.get();
// Process response
if (response.getStatus() == 200) {
String json = response.readEntity(String.class);
System.out.println(json);
}
// Execute a POST request with entity
User user = new User("John", "john@example.com");
Response postResponse = target.path("users")
.request()
.post(Entity.json(user));
// Clean up
client.close();Jersey Client is built around several key components:
This design provides maximum flexibility while maintaining JAX-RS standard compliance, making Jersey Client suitable for enterprise applications, microservices, integration systems, and any Java application requiring robust HTTP client capabilities.
Core client creation and configuration capabilities including SSL context setup, timeout configuration, proxy settings, and connector selection. Essential for establishing HTTP client instances with appropriate security and networking settings.
// Static factory methods
static JerseyClient createClient();
static JerseyClient createClient(Configuration configuration);
// Builder pattern for configuration
public class JerseyClientBuilder extends ClientBuilder {
public JerseyClient build();
public JerseyClientBuilder sslContext(SSLContext sslContext);
public JerseyClientBuilder hostnameVerifier(HostnameVerifier hostnameVerifier);
public ClientBuilder connectTimeout(long timeout, TimeUnit unit);
public ClientBuilder readTimeout(long timeout, TimeUnit unit);
public JerseyClientBuilder register(Class<?> componentClass);
public JerseyClientBuilder register(Object component);
public JerseyClientBuilder property(String name, Object value);
}Client Building and Configuration
HTTP request building and execution with support for all standard HTTP methods, custom headers, query parameters, request entities, and both synchronous and asynchronous operations.
// WebTarget for URI building
public class JerseyWebTarget implements WebTarget {
JerseyWebTarget path(String path);
JerseyWebTarget queryParam(String name, Object... values);
JerseyWebTarget matrixParam(String name, Object... values);
JerseyInvocation.Builder request();
JerseyInvocation.Builder request(String... acceptedResponseTypes);
JerseyWebTarget resolveTemplate(String name, Object value);
}
// Request building and execution
public static class JerseyInvocation.Builder implements Invocation.Builder {
Response get();
Response post(Entity<?> entity);
Response put(Entity<?> entity);
Response delete();
<T> T get(Class<T> responseType);
<T> T post(Entity<?> entity, Class<T> responseType);
Future<Response> submit();
<T> Future<T> submit(Class<T> responseType);
CompletionStageRxInvoker rx();
}HTTP authentication support including Basic authentication, Digest authentication, and Universal authentication modes with both preemptive and non-preemptive options.
public class HttpAuthenticationFeature implements Feature {
static BasicBuilder basicBuilder();
static HttpAuthenticationFeature basic(String username, String password);
static HttpAuthenticationFeature digest(String username, String password);
static UniversalBuilder universalBuilder();
static HttpAuthenticationFeature universal(String username, String password);
boolean configure(FeatureContext context);
}
// Builder interfaces
interface BasicBuilder extends Builder {
BasicBuilder nonPreemptive();
}
interface UniversalBuilder extends Builder {
UniversalBuilder credentialsForBasic(String username, String password);
UniversalBuilder credentialsForDigest(String username, String password);
}Service Provider Interface for pluggable HTTP transport connectors and extensibility hooks including custom connectors, request/response interceptors, and client lifecycle listeners.
// Core SPI interfaces
public interface ConnectorProvider {
Connector getConnector(Client client, Configuration runtimeConfig);
}
public interface Connector extends Inflector<ClientRequest, ClientResponse> {
ClientResponse apply(ClientRequest request);
Future<?> apply(ClientRequest request, AsyncConnectorCallback callback);
String getName();
void close();
}
public interface PreInvocationInterceptor {
void beforeRequest(ClientRequestContext requestContext);
}
public interface PostInvocationInterceptor {
void afterRequest(ClientRequestContext requestContext, ClientResponseContext responseContext);
void onException(ClientRequestContext requestContext, ExceptionContext exceptionContext);
}Request/response filters and features for cross-cutting concerns including content encoding, CSRF protection, HTTP Expect: 100-Continue support, and custom filter development.
// Feature implementations
public class EncodingFeature implements Feature {
EncodingFeature(String... encodings);
EncodingFeature(Class<? extends ContentEncoder>... encoders);
boolean configure(FeatureContext context);
}
public class CsrfProtectionFilter implements ClientRequestFilter {
CsrfProtectionFilter();
CsrfProtectionFilter(String headerName);
void filter(ClientRequestContext requestContext);
}
public class Expect100ContinueFeature implements Feature {
boolean configure(FeatureContext context);
}Reactive and asynchronous request execution using CompletionStage and custom RxInvoker implementations for non-blocking, composable HTTP operations.
// CompletionStage-based reactive invocation
public class JerseyCompletionStageRxInvoker extends JerseyInvocation.AsyncInvoker implements CompletionStageRxInvoker {
// Inherits all HTTP methods from CompletionStageRxInvoker
CompletionStage<Response> get();
CompletionStage<Response> post(Entity<?> entity);
CompletionStage<Response> put(Entity<?> entity);
CompletionStage<Response> delete();
<T> CompletionStage<T> get(Class<T> responseType);
<T> CompletionStage<T> post(Entity<?> entity, Class<T> responseType);
<T> CompletionStage<T> put(Entity<?> entity, Class<T> responseType);
<T> CompletionStage<T> delete(Class<T> responseType);
}
// Accessing reactive invokers
public static class JerseyInvocation.Builder implements Invocation.Builder {
CompletionStageRxInvoker rx();
<T extends RxInvoker> T rx(Class<T> clazz);
}Usage Examples:
import java.util.concurrent.CompletionStage;
// CompletionStage-based reactive requests
CompletionStage<Response> asyncResponse = client.target("https://api.example.com")
.path("users")
.request()
.rx()
.get();
// Chain operations with thenApply
CompletionStage<User> userStage = client.target("https://api.example.com")
.path("users/123")
.request()
.rx()
.get(User.class)
.thenApply(user -> {
user.setLastAccessed(Instant.now());
return user;
});
// Handle errors with exceptionally
CompletionStage<String> result = client.target("https://api.example.com")
.request()
.rx()
.get(String.class)
.exceptionally(throwable -> "Default response");// Core configuration
public class ClientConfig implements Configurable<ClientConfig> {
ClientConfig();
ClientConfig(Class<?>... providerClasses);
ClientConfig loadFrom(Configuration config);
ClientConfig register(Class<?> providerClass);
ClientConfig property(String name, Object value);
Object getProperty(String name);
ConnectorProvider getConnectorProvider();
}
// Request entity processing modes
public enum RequestEntityProcessing {
BUFFERED, // Buffer request entity in memory
CHUNKED // Stream entity using chunked encoding
}
// Client configuration properties
public final class ClientProperties {
// Timeout properties
public static final String CONNECT_TIMEOUT = "jersey.config.client.connectTimeout";
public static final String READ_TIMEOUT = "jersey.config.client.readTimeout";
// Request processing properties
public static final String REQUEST_ENTITY_PROCESSING = "jersey.config.client.request.entity.processing";
public static final String CHUNKED_ENCODING_SIZE = "jersey.config.client.chunkedEncodingSize";
public static final int DEFAULT_CHUNK_SIZE = 4096;
// HTTP behavior properties
public static final String FOLLOW_REDIRECTS = "jersey.config.client.followRedirects";
public static final String SUPPRESS_HTTP_COMPLIANCE_VALIDATION = "jersey.config.client.suppressHttpComplianceValidation";
// Thread pool properties
public static final String ASYNC_THREADPOOL_SIZE = "jersey.config.client.async.threadPoolSize";
public static final String BACKGROUND_SCHEDULER_THREADPOOL_SIZE = "jersey.config.client.backgroundScheduler.threadPoolSize";
// Proxy configuration properties
public static final String PROXY_URI = "jersey.config.client.proxy.uri";
public static final String PROXY_USERNAME = "jersey.config.client.proxy.username";
public static final String PROXY_PASSWORD = "jersey.config.client.proxy.password";
// Content and encoding properties
public static final String USE_ENCODING = "jersey.config.client.useEncoding";
public static final String OUTBOUND_CONTENT_LENGTH_BUFFER = "jersey.config.client.outboundContentLengthBuffer";
// Feature control properties
public static final String FEATURE_AUTO_DISCOVERY_DISABLE = "jersey.config.client.feature.autoDiscovery.disable";
public static final String JSON_BINDING_FEATURE_DISABLE = "jersey.config.client.json.binding.feature.disable";
public static final String JSON_PROCESSING_FEATURE_DISABLE = "jersey.config.client.json.processing.feature.disable";
public static final String MOXY_JSON_FEATURE_DISABLE = "jersey.config.client.moxy.json.feature.disable";
public static final String METAINF_SERVICES_LOOKUP_DISABLE = "jersey.config.client.metainfServicesLookup.disable";
// Authentication properties
public static final String DIGESTAUTH_URI_CACHE_SIZELIMIT = "jersey.config.client.digestAuthUriCacheSizeLimit";
// Advanced properties
public static final String IGNORE_EXCEPTION_RESPONSE = "jersey.config.client.ignoreExceptionResponse";
public static final String EXPECT_100_CONTINUE = "jersey.config.client.request.expect.100.continue.processing";
public static final String EXPECT_100_CONTINUE_THRESHOLD_SIZE = "jersey.config.client.request.expect.100.continue.threshold.size";
public static final Long DEFAULT_EXPECT_100_CONTINUE_THRESHOLD_SIZE = 65536L;
// URI and connector properties
public static final String QUERY_PARAM_STYLE = "jersey.config.client.uri.query.param.style";
public static final String CONNECTOR_PROVIDER = "jersey.config.client.connector.provider";
public static final String SNI_HOST_NAME = "jersey.config.client.snihostname";
public static final String SSL_CONTEXT_SUPPLIER = "jersey.config.client.ssl.context.supplier";
}
// Streaming support
public class ChunkedInput<T> implements Closeable {
ChunkedInput(Class<T> chunkType);
ChunkedInput(GenericType<T> chunkType);
T read() throws IOException;
void close() throws IOException;
}
// Exception types
public class RequestAuthenticationException extends ProcessingException {
RequestAuthenticationException(String message);
RequestAuthenticationException(String message, Throwable cause);
}
public class ResponseAuthenticationException extends ResponseProcessingException {
ResponseAuthenticationException(Response response, String message);
ResponseAuthenticationException(Response response, String message, Throwable cause);
}