{"record":{"id":"2eeafd81c5df2b26","repo":"quarkusio/quarkus","slug":"pattern-cannot-be-blank","errorCode":null,"errorMessage":"Pattern cannot be blank","messagePattern":"Pattern cannot be blank","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/datasource/ReactivePubSubCommandsImpl.java","lineNumber":122,"sourceCode":"            Consumer<Throwable> onException) {\n        return subscribeToPatterns(List.of(pattern), onMessage, onEnd, onException);\n    }\n\n    @Override\n    public Uni<ReactiveRedisSubscriber> subscribeToPattern(String pattern, BiConsumer<String, V> onMessage, Runnable onEnd,\n            Consumer<Throwable> onException) {\n        return subscribeToPatterns(List.of(pattern), onMessage, onEnd, onException);\n    }\n\n    private void validatePatterns(List<String> patterns) {\n        notNullOrEmpty(patterns, \"patterns\");\n\n        for (String pattern : patterns) {\n            if (pattern == null) {\n                throw new IllegalArgumentException(\"Pattern must not be null\");\n            }\n            if (pattern.isBlank()) {\n                throw new IllegalArgumentException(\"Pattern cannot be blank\");\n            }\n        }\n    }\n\n    @Override\n    public Uni<ReactiveRedisSubscriber> subscribeToPatterns(List<String> patterns, Consumer<V> onMessage, Runnable onEnd,\n            Consumer<Throwable> onException) {\n        nonNull(onMessage, \"onMessage\");\n        validatePatterns(patterns);\n\n        return RedisConnections.withNewLongLivedConnection(client, conn -> {\n            RedisAPI api = RedisAPI.api(conn);\n            ReactiveRedisPatternSubscriberImpl subscriber = new ReactiveRedisPatternSubscriberImpl(conn, api, patterns,\n                    (channel, value) -> onMessage.accept(value), onEnd, onException);\n            return subscriber.subscribe()\n                    .replaceWith(subscriber);\n        });\n    }","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/redis-client/runtime/src/main/java/io/quarkus/redis/runtime/datasource/ReactivePubSubCommandsImpl.java#L104-L140","documentation":"validatePatterns() also rejects blank pattern strings (empty or whitespace-only). A blank glob pattern is meaningless for PSUBSCRIBE and would either fail server-side or subscribe unexpectedly, so an IllegalArgumentException is thrown before the subscription request.","triggerScenarios":"Calling subscribeToPatterns(...) with a list containing \"\" or \"   \" (blank) elements.","commonSituations":"Empty configuration value parsed as an empty-string pattern; trimming bugs that leave whitespace-only strings; defaults like \"\" instead of omitting the pattern.","solutions":["Filter blank entries: patterns.stream().filter(p -> p != null && !p.isBlank()).toList().","Trim user/config supplied patterns and drop empties before subscribing.","Use a valid glob such as \"*\" or \"channel.*\" if a catch-all pattern is intended."],"exampleFix":"// before\nList<String> patterns = List.of(\"\"); // blank\npubsub.subscribeToPatterns(patterns, onMessage);\n\n// after\nList<String> patterns = List.of(\"orders.*\");\npubsub.subscribeToPatterns(patterns, onMessage);","handlingStrategy":"validation","validationCode":"if (patterns == null || patterns.stream().anyMatch(p -> p == null || p.isBlank())) {\n    throw new IllegalArgumentException(\"patterns must not contain blank entries\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    pubsub.subscribeToPatterns(patterns, onMessage);\n} catch (IllegalArgumentException e) {\n    // trim/filter blanks and retry\n}","preventionTips":["Trim configured patterns and drop empties at load time.","Default blank patterns to a meaningful glob like \"*\".","Validate pattern config values in a startup check."],"tags":["redis","quarkus","pubsub","argument-validation"],"backgroundTag":"invalid-argument-blank","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}