Как получить хост и порт локального сервера в Spring Boot?
Я запускаю приложение загрузки Spring с mvn spring-boot:run
.
Один из моих @Controller
нуждается в информации о хосте и порту, которые прослушивает приложение, т.е. localhost:8080
(или 127.x.y.z:8080
). После Spring загрузочной документации я использую свойства server.address
и server.port
:
@Controller
public class MyController {
@Value("${server.address}")
private String serverAddress;
@Value("${server.port}")
private String serverPort;
//...
}
При запуске приложения с mvn spring-boot:run
я получаю следующее исключение:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myController': Injection of autowired dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Could not autowire field: ... String ... serverAddress; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'server.address' in string value "${server.address}"
Оба server.address
и server.port
не могут быть автообновлены.
Как узнать (локальный) хост/адрес/сетевой адаптер и порт, на которые привязано приложение загрузки Spring?
Ответы
Ответ 1
IP-адрес
Вы можете получить сетевые интерфейсы с NetworkInterface.getNetworkInterfaces()
, а затем IP-адреса с объектов NetworkInterface, возвращаемых с помощью .getInetAddresses()
, затем строковое представление этих адресов с .getHostAddress()
.
Порт
Если вы создаете класс @Configuration
, который реализует ApplicationListener<EmbeddedServletContainerInitializedEvent>
, вы можете переопределить onApplicationEvent
, чтобы получить номер порта после его установки.
@Override
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
int port = event.getEmbeddedServletContainer().getPort();
}
Ответ 2
Вы можете получить информацию о порте через
@Value("${local.server.port}")
private String serverPort;
Ответ 3
Простым обходным путем, по крайней мере, для получения рабочего порта, является добавление параметра javax.servlet.HttpServletRequest в подпись одного из методов контроллера. Как только у вас есть экземпляр HttpServletRequest, вы можете просто получить baseUrl с этим: request.getRequestURL(). ToString()
Посмотрите на этот код:
@PostMapping(value = "/registration" , produces = "application/json")
public StringResponse register(@RequestBody RequestUserDTO userDTO,
HttpServletRequest request) {
request.getRequestURL().toString();
//value: http://localhost:8080/registration
------
return "";
}
Ответ 4
Одно решение, упомянутое в ответе @M. Deinum - это тот, который я использовал в ряде приложений Akka:
object Localhost {
/**
* @return String for the local hostname
*/
def hostname(): String = InetAddress.getLocalHost.getHostName
/**
* @return String for the host IP address
*/
def ip(): String = InetAddress.getLocalHost.getHostAddress
}
Я использовал этот метод при создании URL-адреса обратного вызова для Oozie REST, чтобы Oozie мог обратиться к моей службе REST, и он работал как шарм
Ответ 5
Чтобы получить номер порта в коде, вы можете использовать следующее:
@Autowired
Environment environment;
@GetMapping("/test")
String testConnection(){
return "Your server is up and running at port: "+environment.getProperty("local.server.port");
}
Чтобы понять свойство Environment, вы можете пройти через это
Spring среда загрузки
Ответ 6
Я только что нашел способ легко получить IP-адрес и порт сервера с помощью клиентской библиотеки Eureka. Так как я все равно использую его для регистрации услуг, для меня это не дополнительная библиотека.
Сначала нужно добавить зависимость maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
Затем вы можете использовать сервис ApplicationInfoManager в любом из ваших бинов Spring.
@Autowired private ApplicationInfoManager applicationInfoManager;
...
InstanceInfo applicationInfo = applicationInfoManager.getInfo();
Объект InstanceInfo содержит всю важную информацию о вашей службе, такую как IP-адрес, порт, имя хоста и т.д.
Ответ 7
На весну 2
val hostName = InetAddress.getLocalHost().hostName
var webServerPort: Int = 0
@Configuration
class ApplicationListenerWebServerInitialized : ApplicationListener<WebServerInitializedEvent> {
override fun onApplicationEvent(event: WebServerInitializedEvent) {
webServerPort = event.webServer.port
}
}
тогда вы можете также использовать webServerPort
из любого места...
Ответ 8
Вы можете получить имя хоста из свойства spring cloud в spring-cloud-commons-2.1.0.RC2.jar
environment.getProperty("spring.cloud.client.ip-address");
environment.getProperty("spring.cloud.client.hostname");
spring.factories spring-cloud-commons-2.1.0.RC2.jar
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.cloud.client.HostInfoEnvironmentPostProcessor