Как я могу получить хост и порт, где мое приложение развернуто во время выполнения, чтобы я мог использовать его в своем java-методе?
Как получить SPRING загрузочный HOST и адрес PORT во время выполнения?
Ответ 1
Вы можете получить эту информацию через Environment
для port
и host
, вы можете получить с помощью InternetAddress
.
@Autowired
Environment environment;
......
public void somePlaceInTheCode() {
// Port
environment.getProperty("server.port");
// Local address
InetAddress.getLocalHost().getHostAddress();
InetAddress.getLocalHost().getHostName();
// Remote address
InetAddress.getLoopbackAddress().getHostAddress();
InetAddress.getLoopbackAddress().getHostName();
}
Ответ 2
Для хоста: Как упоминалось Антоном
// Local address
InetAddress.getLocalHost().getHostAddress();
InetAddress.getLocalHost().getHostName();
// Remote address
InetAddress.getLoopbackAddress().getHostAddress();
InetAddress.getLoopbackAddress().getHostName();
Порт: Как упоминалось Николаем, вы можете получить эту информацию по свойству среды только в том случае, если она настроена явно и не установлена в 0.
Spring документация по теме: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-discover-the-http-port-at-runtime
Для фактического способа сделать это, здесь был дан ответ: Spring Загрузка - Как получить рабочий порт
И вот пример github о том, как его реализовать: https://github.com/hosuaby/example-restful-project/blob/master/src/main/java/io/hosuaby/restful/PortHolder.java
Ответ 3
Просто полный пример ответов выше
package bj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.Environment;
import java.net.InetAddress;
import java.net.UnknownHostException;
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@SpringBootApplication
class App implements ApplicationListener<ApplicationReadyEvent> {
@Autowired
private ApplicationContext applicationContext;
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
try {
String ip = InetAddress.getLocalHost().getHostAddress();
int port = applicationContext.getBean(Environment.class).getProperty("server.port", Integer.class, 8080);
System.out.printf("%s:%d", ip, port);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
Ответ 4
Порт был привязан во время выполнения и может быть введен как:
@Value('${local.server.port}')
private int port;
Ответ 5
Вот компонент утилит:
EnvUtil.java
(Положите его в соответствующую упаковку, чтобы он стал компонентом.)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* Environment util.
*/
@Component
public class EnvUtil {
@Autowired
Environment environment;
private String port;
private String hostname;
/**
* Get port.
*
* @return
*/
public String getPort() {
if (port == null) port = environment.getProperty("local.server.port");
return port;
}
/**
* Get port, as Integer.
*
* @return
*/
public Integer getPortAsInt() {
return Integer.valueOf(getPort());
}
/**
* Get hostname.
*
* @return
*/
public String getHostname() throws UnknownHostException {
// TODO ... would this cache cause issue, when network env change ???
if (hostname == null) hostname = InetAddress.getLocalHost().getHostAddress();
return hostname;
}
public String getServerUrlPrefi() throws UnknownHostException {
return "http://" + getHostname() + ":" + getPort();
}
}
Пример - используйте утилиту:
Затем может ввести утилиту и вызвать ее метод.
Вот пример в контроллере:
// inject it,
@Autowired
private EnvUtil envUtil;
/**
* env
*
* @return
*/
@GetMapping(path = "/env")
@ResponseBody
public Object env() throws UnknownHostException {
Map<String, Object> map = new HashMap<>();
map.put("port", envUtil.getPort());
map.put("host", envUtil.getHostname());
return map;
}
Ответ 6
Если вы используете случайный порт, как метод server.port=${random.int[10000,20000]}
. и в коде Java читайте порт в Environment
, используйте @Value
или getProperty("server.port")
. Вы получите непредсказуемый порт, потому что он случайный.
ApplicationListener, вы можете переопределить onApplicationEvent, чтобы получить номер порта после его установки.
В загрузочной версии Spring Реализует интерфейс Spring ApplicationListener<EmbeddedServletContainerInitializedEvent>
(загрузочная версия Spring 1) или ApplicationListener<WebServerInitializedEvent>
(загрузочная версия 2) переопределение onApplicationEvent, чтобы получить Fact Port.
Пружинный ботинок 1
@Override
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
int port = event.getEmbeddedServletContainer().getPort();
}
Spring boot 2
@Override
public void onApplicationEvent(WebServerInitializedEvent event) {
Integer port = event.getWebServer().getPort();
this.port = port;
}