programing

실행 시 SPRING Boot HOST 및 PORT 주소를 취득하려면 어떻게 해야 합니까?

muds 2023. 3. 22. 22:15
반응형

실행 시 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

반응형