redis/jedis · critical · InvalidURIException
Cannot open Redis connection due invalid URI
Error message
Cannot open Redis connection due invalid URI "%s".
What it means
The Jedis(URI) constructor validates the URI with JedisURIHelper.isValid before opening a connection. If the URI is not a valid Redis URI (bad scheme, missing host/port, non-numeric or out-of-range db index, malformed user/password), it throws InvalidURIException and no connection is created. This is a fail-fast guard so invalid config never reaches the network layer.
Solutions
- Validate the URI before constructing Jedis with JedisURIHelper.isValid(uri) and print the reason
- Ensure the URI uses redis:// or rediss:// scheme and includes host and port
- Parse the URI with new URI(str) in a try-catch first to surface malformed syntax early
- Check the env var / config value actually contains a well-formed Redis URI
Example fix
// before
Jedis jedis = new Jedis(URI.create(System.getenv("REDIS_URL")));
// after
URI uri = URI.create(System.getenv("REDIS_URL"));
if (!JedisURIHelper.isValid(uri)) {
throw new IllegalArgumentException("Invalid REDIS_URL: " + uri);
}
Jedis jedis = new Jedis(uri); Defensive patterns
Strategy: validation
Validate before calling
URI uri = URI.create(raw); boolean ok = JedisURIHelper.isValid(uri);
Type guard
boolean isValidRedisUri(URI uri) { return uri != null && JedisURIHelper.isValid(uri); } Try / catch
try {
jedis = new Jedis(uri);
} catch (InvalidURIException e) {
log.error("Bad Redis URI {}: {}", uri, e.getMessage());
throw new ConfigurationException(e);
} Prevention
- Validate REDIS_URL-style env vars at startup with JedisURIHelper.isValid
- Always include the redis:// or rediss:// scheme in configured URIs
- Trim and quote-strip config values before URI.create
- Keep db indexes in the path numeric (e.g. /0)
When it happens
Trigger: new Jedis(URI) where the scheme is not redis/rediss, the URI has no host or port, the db path segment is not a number, or JedisURIHelper cannot parse the userinfo (user/password) portion.
Common situations: Copy-pasting a URI from another service (postgres://, amqp://) into Jedis config; environment variables like REDIS_URL being empty or containing extra text; forgetting redis:// scheme (e.g. 'myhost:6379' passed as URI); db index like '/db' instead of '/0'.
Understand the failure class
Background: "Invalid URL" errors: why new URL(), URI.parse, and reqwest::Url reject your string — missing scheme, whitespace, and bad path format — this error's family across 39 libraries.
Related errors
- protocol must not be null
- Attempting to write to a broken connection.
- Attempting to read from a broken connection.
- HostAndPort is required when no socketFactory is provided
- DIALECT=0 cannot be set.
AI-assisted analysis of redis/jedis@6dac31d4c2 (2026-09-08).
Data as JSON: /api/errors/9b321a7934711533.
Report an issue: GitHub.
Appendix: source
Thrown at src/main/java/redis/clients/jedis/Jedis.java:233
.connectionTimeoutMillis(connectionTimeout).socketTimeoutMillis(soTimeout).ssl(ssl)
.sslSocketFactory(sslSocketFactory).sslParameters(sslParameters)
.hostnameVerifier(hostnameVerifier).build());
}
public Jedis(final String host, final int port, final int connectionTimeout,
final int soTimeout, final int infiniteSoTimeout, final boolean ssl,
final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters,
final HostnameVerifier hostnameVerifier) {
this(host, port, DefaultJedisClientConfig.builder()
.connectionTimeoutMillis(connectionTimeout).socketTimeoutMillis(soTimeout)
.blockingSocketTimeoutMillis(infiniteSoTimeout).ssl(ssl)
.sslSocketFactory(sslSocketFactory).sslParameters(sslParameters)
.hostnameVerifier(hostnameVerifier).build());
}
public Jedis(URI uri) {
if (!JedisURIHelper.isValid(uri)) {
throw new InvalidURIException(String.format(
"Cannot open Redis connection due invalid URI \"%s\".", uri.toString()));
}
connection = new Connection(new HostAndPort(uri.getHost(), uri.getPort()),
DefaultJedisClientConfig.builder().autoNegotiateProtocol(false)
.user(JedisURIHelper.getUser(uri))
.password(JedisURIHelper.getPassword(uri)).database(JedisURIHelper.getDBIndex(uri))
.protocol(JedisURIHelper.getRedisProtocol(uri))
.ssl(JedisURIHelper.isRedisSSLScheme(uri)).build());
commandObjects = new CommandObjects(RedisProtocol.REDIS_SERVER_DEFAULT_PROTO);
}
public Jedis(URI uri, final SSLSocketFactory sslSocketFactory,
final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) {
this(uri, DefaultJedisClientConfig.builder().sslSocketFactory(sslSocketFactory)
.sslParameters(sslParameters).hostnameVerifier(hostnameVerifier).build());
}
public Jedis(final URI uri, final int timeout) {View on GitHub (pinned to 6dac31d4c2)