web-dev-qa-db-ja.com

実行時にSPRINGブートホストとポートアドレスを取得する方法は?

Javaメソッドで使用できるように、実行時にアプリケーションがデプロイされるホストとポートを取得するにはどうすればよいですか?

16
Anezka L.

この情報は、 Environmentport および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();
}
18

_server.port=${random.int[10000,20000]}_メソッドのようなランダムポートを使用する場合。およびJavaコードはEnvironmentでポートを読み取り、_@Value_またはgetProperty("server.port")を使用します。予測できないポートを取得しますランダムです。

ApplicationListener、onApplicationEventをオーバーライドして、設定後にポート番号を取得できます。

SpringブートバージョンでSpringインターフェイス_ApplicationListener<EmbeddedServletContainerInitializedEvent>_(Springブートバージョン1)または_ApplicationListener<WebServerInitializedEvent>_(Springブートバージョン2)を実装して、onApplicationEventをオーバーライドしてFact Portを取得します。

春のブーツ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;
}
_
0
Gim Lyu

実行時にポートがバインドされているため、次のように挿入できます。

@Value('${local.server.port}')
private int port;
0
Mars Liu

ホスト向け:アントンが言及したとおり

// Local address
InetAddress.getLocalHost().getHostAddress();
InetAddress.getLocalHost().getHostName();

// Remote address
InetAddress.getLoopbackAddress().getHostAddress();
InetAddress.getLoopbackAddress().getHostName();

ポート:Nicolaiが述べたように、環境プロパティによってこの情報を取得できるのは、明示的に設定されており、0に設定されていない場合のみです。

このテーマに関するSpringドキュメント: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-discover-the-http-実行時ポート

これを行う実際の方法については、ここで回答されました: Spring Boot-実行中のポートを取得する方法

そして、これを実装する方法に関するgithubの例は次のとおりです。 https://github.com/hosuaby/example-restful-project/blob/master/src/main/Java/io/hosuaby/restful/PortHolder.Java

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;
}
0
Eric Wang

上記の回答の完全な例

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();
        }
    }
}
0
BaiJiFeiLong