실행 시 SPRING Boot HOST 및 PORT 주소를 취득하려면 어떻게 해야 합니까?
런타임에 애플리케이션이 배포되는 호스트와 포트를 가져와 Java 메서드로 사용하려면 어떻게 해야 합니까?
이 정보는 및 을 통해 입수할 수 있습니다.host
를 사용하여 얻을 수 있습니다.InternetAddress
.
@Autowired
Environment environment;
// Port via annotation
@Value("${server.port}")
int aPort;
......
public void somePlaceInTheCode() {
// Port
environment.getProperty("server.port");
// Local address
InetAddress.getLocalHost().getHostAddress();
InetAddress.getLocalHost().getHostName();
// Remote address
InetAddress.getLoopbackAddress().getHostAddress();
InetAddress.getLoopbackAddress().getHostName();
}
랜덤 포트를 사용하는 경우server.port=${random.int[10000,20000]}
method. 및 Java 코드에서 포트를 읽습니다.Environment
사용하다@Value
또는getProperty("server.port")
랜덤이기 때문에 예측 불가능한 포트가 표시됩니다.
ApplicationListener는 설정 후 onApplicationEvent를 덮어쓰고 포트 번호를 가져올 수 있습니다.
스프링 부트 버전에서 스프링 인터페이스를 구현합니다.ApplicationListener<EmbeddedServletContainerInitializedEvent>
(스프링 부트 버전 1) 또는ApplicationListener<WebServerInitializedEvent>
(스프링 부트버전 2)는 온애플리케이션이벤트를 덮어쓰고 FactPort를 가져옵니다.
스프링 부츠 1
@Override
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
int port = event.getEmbeddedServletContainer().getPort();
}
스프링 부츠 2
@Override
public void onApplicationEvent(WebServerInitializedEvent event) {
Integer port = event.getWebServer().getPort();
this.port = port;
}
다음은 util 컴포넌트입니다.
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();
}
}
예 - util을 사용합니다.
그러면 util을 주입하고 메서드를 호출할 수 있습니다.
다음으로 컨트롤러의 예를 나타냅니다.
// 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;
}
호스트용: Anton이 언급한 바와 같이
// Local address
InetAddress.getLocalHost().getHostAddress();
InetAddress.getLocalHost().getHostName();
// Remote address
InetAddress.getLoopbackAddress().getHostAddress();
InetAddress.getLoopbackAddress().getHostName();
포트:Nicolai에서 설명한 바와 같이 이 정보는 0으로 설정되지 않고 명시적으로 설정되어 있는 경우에만 환경 속성별로 검색할 수 있습니다.
이 주제에 대한 봄 문서: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-discover-the-http-port-at-runtime
실제 방법에 대해서는, 「Spring Boot」(스프링 부트) - 「실행동중의 포토를 취득하는 방법
구현 방법에 대한 github의 예를 다음에 제시하겠습니다.https://github.com/hosuaby/example-restful-project/blob/master/src/main/java/io/hosuaby/restful/PortHolder.java
상기 답변의 완전한 예에 불과합니다.
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();
}
}
}
실행 시 바인딩된 포트는 다음과 같이 삽입될 수 있습니다.
@Value('${local.server.port}')
private int port;
언급URL : https://stackoverflow.com/questions/38916213/how-to-get-the-spring-boot-host-and-port-address-during-run-time
'programing' 카테고리의 다른 글
MongoDB에서 동등한 SQL Join을 실행하려면 어떻게 해야 합니까? (0) | 2023.03.22 |
---|---|
ORA-00904: 잘못된 식별자 (0) | 2023.03.22 |
BeanFactory와 어플리케이션 컨텍스트 (0) | 2023.03.22 |
MySQL에서 JSON 필드 속성의 값을 선택합니다. (0) | 2023.03.22 |
Spring과 통합된 임베디드 Tomcat을 localhost 외에 IP 주소에 대한 요청을 수신하도록 설정하려면 어떻게 해야 합니까? (0) | 2023.03.22 |