From 5229ac7e5882cbfbdeb5aecbb9f199f770776cf1 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 11 Nov 2025 16:07:35 +0000 Subject: [PATCH] Stop throwing PortInUseException for unassignable address Previously, an unassignable address would result in NettyWebServer incorrectly throwing a PortInUseException. Fixes gh-47618 --- .../boot/web/embedded/netty/NettyWebServer.java | 2 +- .../netty/NettyReactiveWebServerFactoryTests.java | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/netty/NettyWebServer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/netty/NettyWebServer.java index 236c7b39929..61180e9f5f6 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/netty/NettyWebServer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/netty/NettyWebServer.java @@ -117,7 +117,7 @@ public class NettyWebServer implements WebServer { catch (Exception ex) { PortInUseException.ifCausedBy(ex, ChannelBindException.class, (bindException) -> { if (bindException.localPort() > 0 && !isPermissionDenied(bindException.getCause())) { - throw new PortInUseException(bindException.localPort(), ex); + PortInUseException.throwIfPortBindingException(bindException, bindException::localPort); } }); throw new WebServerException("Unable to start Netty", ex); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java index cb03e6efb0e..fa09e787b6b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java @@ -17,7 +17,9 @@ package org.springframework.boot.web.embedded.netty; import java.net.ConnectException; +import java.net.InetAddress; import java.net.SocketAddress; +import java.net.UnknownHostException; import java.time.Duration; import java.util.Arrays; @@ -45,6 +47,7 @@ import org.springframework.boot.web.reactive.server.AbstractReactiveWebServerFac import org.springframework.boot.web.server.PortInUseException; import org.springframework.boot.web.server.Shutdown; import org.springframework.boot.web.server.Ssl; +import org.springframework.boot.web.server.WebServerException; import org.springframework.http.MediaType; import org.springframework.http.client.ReactorResourceFactory; import org.springframework.http.client.reactive.ReactorClientHttpConnector; @@ -70,7 +73,7 @@ import static org.mockito.Mockito.mock; class NettyReactiveWebServerFactoryTests extends AbstractReactiveWebServerFactoryTests { @Test - void exceptionIsThrownWhenPortIsAlreadyInUse() { + void portInUseExceptionIsThrownWhenPortIsAlreadyInUse() { AbstractReactiveWebServerFactory factory = getFactory(); factory.setPort(0); this.webServer = factory.getWebServer(new EchoHandler()); @@ -81,6 +84,14 @@ class NettyReactiveWebServerFactoryTests extends AbstractReactiveWebServerFactor .withCauseInstanceOf(Throwable.class); } + @Test + void webServerExceptionIsThrownWhenAddressCannotBeAssigned() throws UnknownHostException { + AbstractReactiveWebServerFactory factory = getFactory(); + factory.setPort(8080); + factory.setAddress(InetAddress.getByName("1.2.3.4")); + assertThatExceptionOfType(WebServerException.class).isThrownBy(factory.getWebServer(new EchoHandler())::start); + } + @Test void getPortWhenDisposableServerPortOperationIsUnsupportedReturnsMinusOne() { NettyReactiveWebServerFactory factory = new NoPortNettyReactiveWebServerFactory(0);