Я знаю Server.port = 0 Выбирает случайный порт, но это неудобно для развития. />
Код: Выделить всё
@Bean
public ApplicationListener logWhenReadyEvent(LoggingProperties properties, Environment environment) {
return event -> {
String port = environment.getProperty("server.port", "8080");
// Log server URL
};
}
< /code>
попытался сделать это таким образом < /h2>
@Component
public class PortFinder implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
// Try to set available port - doesn't work
}
}
< /code>
Спасибо за предложение. Мне нужно поймать BindException < /code>
добавить его в качестве боба. Мои приложения теперь автоконфигурированы для динамического изменения своих портов. Спасибо! Кредиты < /p>
Рабокое решение < /h3>
@Bean
public WebServerFactoryCustomizer webServerFactoryCustomizer() {
return new SpringPortSolver();
}
public static class SpringPortSolver implements WebServerFactoryCustomizer {
private static final Logger logger = LoggerFactory.getLogger(SpringPortSolver.class);
@Value("${server.port:8080}")
String serverPort;
@Override
public void customize(ConfigurableWebServerFactory factory) {
int port;
try {
port = Integer.parseInt(serverPort);
} catch (NumberFormatException e) {
logger.error("Invalid server.port value: {}. Using default port 8080 instead.", serverPort);
port = 8080;
}
int originalPort = port;
int maxPortToTry = port + 100; // Limit how far we'll search to avoid infinite loops
logger.info("Attempting to find available port starting from {}", port);
while (port < maxPortToTry) {
try (ServerSocket socket = new ServerSocket()) {
// Use bind with InetSocketAddress to better handle binding issues
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress("localhost", port));
int availablePort = socket.getLocalPort();
logger.info("Port {} is available. Using port {} for server.", availablePort, availablePort);
factory.setPort(availablePort);
return;
} catch (BindException e) {
logger.warn("Port {} is already in use. Trying port {} instead.", port, port + 1);
port += 1;
} catch (IOException e) {
logger.error("Failed to test port {}: {}", port, e.getMessage());
// Try next port anyway
port += 1;
}
}
// If we've exhausted all ports in our range, use a random port
logger.warn("Unable to find available port in range {}-{}. Using random port instead.", originalPort, maxPortToTry);
factory.setPort(0);
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... igured-por