116

私はSpring Bootアプリケーション(組み込みのTomcat 7を使用)を持っており、ランダムなポートを持つことができるように設定server.port = 0しました。application.propertiesサーバーが起動され、ポートで実行された後、選択されたポートを取得できる必要があります。

@Value("$server.port")ゼロなので使えません。これは一見単純な情報に見えるのに、Java コードからアクセスできないのはなぜですか? どうすればアクセスできますか?

4

12 に答える 12

109

同様の方法で管理ポートにアクセスすることも可能ですか?

  @SpringBootTest(classes = {Application.class}, webEnvironment = WebEnvironment.RANDOM_PORT)
  public class MyTest {

    @LocalServerPort
    int randomServerPort;

    @LocalManagementPort
    int randomManagementPort;
于 2016-08-11T11:15:55.743 に答える
89

Spring の環境は、この情報を保持します。

@Autowired
Environment environment;

String port = environment.getProperty("local.server.port");

@Value("${local.server.port}")表面的には、これは注釈付きのフィールド(または同一の )を注入するのと同じように見えます@LocalServerPort。これにより、コンテキストが完全に初期化されるまで値を使用できないため、起動時に自動配線エラーがスローされます。ここでの違いは、この呼び出しは、アプリケーションの起動時に呼び出されるのではなく、実行時のビジネス ロジックで暗黙的に行われるため、ポートの「遅延フェッチ」は正常に解決されることです。

于 2016-04-03T21:02:24.180 に答える
7

これらの解決策はどれもうまくいきませんでした。Swagger 構成 Bean を作成する際に、サーバー・ポートを知る必要がありました。ServerPropertiesを使用するとうまくいきました。

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.ws.rs.ApplicationPath;

import io.swagger.jaxrs.config.BeanConfig;
import io.swagger.jaxrs.listing.ApiListingResource;
import io.swagger.jaxrs.listing.SwaggerSerializers;

import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.stereotype.Component;

@Component
@ApplicationPath("api")
public class JerseyConfig extends ResourceConfig 
{
    @Inject
    private org.springframework.boot.autoconfigure.web.ServerProperties serverProperties;

    public JerseyConfig() 
    {
        property(org.glassfish.jersey.server.ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
    }

    @PostConstruct
    protected void postConstruct()
    {
        // register application endpoints
        registerAndConfigureSwaggerUi();
    }

    private void registerAndConfigureSwaggerUi()
    {
        register(ApiListingResource.class);
        register(SwaggerSerializers.class);

        final BeanConfig config = new BeanConfig();
        // set other properties
        config.setHost("localhost:" + serverProperties.getPort()); // gets server.port from application.properties file         
    }
}

この例では、Spring Boot 自動構成と JAX-RS (Spring MVC ではありません) を使用します。

于 2016-04-06T20:35:40.840 に答える
-1

正しいパッケージをインポートしたことを確認してください

import org.springframework.core.env.Environment;

次に、環境オブジェクトを使用します

@Autowired
private Environment env;    // Environment Object containts the port number

 @GetMapping("/status")
  public String status()
    {
   return "it is runing on"+(env.getProperty("local.server.port"));
    }
于 2020-01-21T21:13:19.863 に答える