Closed
Description
HandshakeWebSocketService#initUpgradeStrategy
does not check for the availability of relevant classes before attempting to instanciate StandardWebSocketUpgradeStrategy
.
static RequestUpgradeStrategy initUpgradeStrategy() {
if (tomcatWsPresent) {
return new TomcatRequestUpgradeStrategy();
}
else if (jettyWsPresent) {
return new JettyRequestUpgradeStrategy();
}
else if (undertowWsPresent) {
return new UndertowRequestUpgradeStrategy();
}
else if (reactorNettyPresent) {
// As late as possible (Reactor Netty commonly used for WebClient)
return ReactorNettyStrategyDelegate.forReactorNetty1();
}
else if (reactorNetty2Present) {
// As late as possible (Reactor Netty commonly used for WebClient)
return ReactorNettyStrategyDelegate.forReactorNetty2();
}
else {
// Let's assume Jakarta WebSocket API 2.1+
return new StandardWebSocketUpgradeStrategy();
}
}
This breaks when you attempt to load a context without a dependency on jakarta.websocket-client-api.
It looks like it should be handled gracefully by the following code in WebFluxConfigurationSupport:
private WebSocketService initWebSocketService() {
WebSocketService service = getWebSocketService();
if (service == null) {
try {
service = new HandshakeWebSocketService();
}
catch (IllegalStateException ex) {
// Don't fail, test environment perhaps
service = new NoUpgradeStrategyWebSocketService();
}
}
return service;
}
but because a ClassNotFoundException is thrown instead of IllegalStateException; the context simply fails to load instead of falling back to NoUpgradeStrategyWebSocketService