Как получить хост и порт локального сервера в 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