Javaメソッドで使用できるように、実行時にアプリケーションがデプロイされるホストとポートを取得するにはどうすればよいですか?
この情報は、 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();
}
_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;
}
_
実行時にポートがバインドされているため、次のように挿入できます。
@Value('${local.server.port}')
private int port;
ホスト向け:アントンが言及したとおり
// 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;
}
上記の回答の完全な例
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();
}
}
}