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

  1. Validate the URI before constructing Jedis with JedisURIHelper.isValid(uri) and print the reason
  2. Ensure the URI uses redis:// or rediss:// scheme and includes host and port
  3. Parse the URI with new URI(str) in a try-catch first to surface malformed syntax early
  4. 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

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


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)