{"record":{"id":"47910e7b1b146f39","repo":"quarkusio/quarkus","slug":"jdk-provider-does-not-support-s-protocol","errorCode":null,"errorMessage":"JDK provider does not support %s protocol","messagePattern":"JDK provider does not support (.+?) protocol","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java","lineNumber":381,"sourceCode":"                        return new JdkAlpnApplicationProtocolNegotiator(false, config.supportedProtocols());\n                    } else {\n                        throw new UnsupportedOperationException(new StringBuilder(\"JDK provider does not support \")\n                                .append(config.selectorFailureBehavior()).append(\" failure behavior\").toString());\n                    }\n                } else {\n                    switch (config.selectedListenerFailureBehavior()) {\n                        case ACCEPT:\n                            return new JdkAlpnApplicationProtocolNegotiator(false, config.supportedProtocols());\n                        case FATAL_ALERT:\n                            return new JdkAlpnApplicationProtocolNegotiator(true, config.supportedProtocols());\n                        default:\n                            throw new UnsupportedOperationException(new StringBuilder(\"JDK provider does not support \")\n                                    .append(config.selectedListenerFailureBehavior()).append(\" failure behavior\")\n                                    .toString());\n                    }\n                }\n            default:\n                throw new UnsupportedOperationException(\n                        new StringBuilder(\"JDK provider does not support \").append(config.protocol())\n                                .append(\" protocol\")\n                                .toString());\n        }\n    }\n\n}\n\n@TargetClass(className = \"io.netty.bootstrap.FailedChannel\")\nfinal class Target_io_netty_bootstrap_FailedChannel {\n\n    @Alias\n    Target_io_netty_bootstrap_FailedChannel() {\n    }\n}\n\n/*\n * This one only prints exceptions otherwise we get a useless bogus","sourceCodeStart":363,"sourceCodeEnd":399,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java#L363-L399","documentation":"The JDK SSL provider only implements a subset of Netty's application protocol negotiation protocols (ALPN and NPN are supported; NONE or other values are not). The default branch of toNegotiator's protocol switch throws UnsupportedOperationException naming the unsupported protocol.","triggerScenarios":"Building an SslContext with SslProvider.JDK and an ApplicationProtocolConfig whose protocol() is not ALPN/NPN (e.g. Protocol.NONE, or an unhandled enum value) — in native image via the Quarkus Netty substitution.","commonSituations":"Passing ApplicationProtocolConfig.EMPTY / Protocol.NONE while still requesting a negotiator; refactor from deprecated ApplicationProtocolUtil defaults; JDK provider used where OpenSSL-specific protocol config was intended.","solutions":["Set the ApplicationProtocolConfig protocol to ALPN (or NPN) when using the JDK provider.","Pass null instead of an ApplicationProtocolConfig when no negotiation is desired.","Use the OpenSSL provider if a protocol the JDK cannot negotiate is required."],"exampleFix":"// before\nApplicationProtocolConfig apn = new ApplicationProtocolConfig(\n    ApplicationProtocolConfig.Protocol.NONE,\n    ApplicationProtocolConfig.SelectorFailureBehavior.FATAL_ALERT,\n    ApplicationProtocolConfig.SelectedListenerFailureBehavior.FATAL_ALERT,\n    Collections.emptyList());\n// after\nApplicationProtocolConfig apn = new ApplicationProtocolConfig(\n    ApplicationProtocolConfig.Protocol.ALPN,\n    ApplicationProtocolConfig.SelectorFailureBehavior.NO_ADVERTISE,\n    ApplicationProtocolConfig.SelectedListenerFailureBehavior.FATAL_ALERT,\n    List.of(\"h2\", \"http/1.1\"));","handlingStrategy":"validation","validationCode":"if (config.protocol() != ApplicationProtocolConfig.Protocol.ALPN\n        && config.protocol() != ApplicationProtocolConfig.Protocol.NPN) {\n    throw new IllegalArgumentException(\"JDK provider supports only ALPN/NPN, got \" + config.protocol());\n}","typeGuard":null,"tryCatchPattern":"try {\n    ctx = builder.build();\n} catch (UnsupportedOperationException e) {\n    if (e.getMessage().contains(\"protocol\")) {\n        ctx = rebuildWithAlpnProtocol();\n    } else { throw e; }\n}","preventionTips":["Always use Protocol.ALPN (or NPN) when a negotiator is required on JDK","Pass null for ApplicationProtocolConfig when no protocol negotiation is needed","Keep HTTP/2 bootstrap examples aligned with the provider actually used"],"tags":["netty","ssl","alpn","jdk","protocol"],"backgroundTag":"alpn-unsupported-jdk-provider","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"}