如何在 micronaut 中获取当前主机和端口?

How to get current host and port in micronaut?

我正在尝试获取 micronaut 应用程序中的当前主机和端口。我如何以动态方式获取它?

我试过 @Value("{micronaut.server.host}") 和 @Value("{micronaut.server.port}") 但没有用。

@Controller("/some/endpoint")
class SomeController {
    @Value("{micronaut.server.host}")
    protected String host;

    @Value("{micronaut.server.port}")
    protected Long port;
}

我的错误。正如@JaredWare 所说,我们应该使用 Environment 来检索应用程序的 属性。

@Controller("/some/endpoint")
class SomeController {
   @Inject
   protected Environment env;

   @Get
   public String someMethod () {
       Optional<String> host = this.env.getProperty("micronaut.server.host", String.class);
       return host.orElse("defaultHost");
   }
}

有多种方法可以做到这一点。一种是从 EmbeddedServer.

检索它们
import io.micronaut.http.HttpStatus;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.runtime.server.EmbeddedServer;

@Controller("/demo")
public class DemoController {

    protected final String host;

    protected final int port;

    public DemoController(EmbeddedServer embeddedServer) {
        host = embeddedServer.getHost();
        port = embeddedServer.getPort();
    }

    @Get("/")
    public HttpStatus index() {
        return HttpStatus.OK;
    }
}

您拥有它的原始方式与从 environment 中检索它的方式相同。您只是在 @Value 注释中遗漏了 $

@Value("${micronaut.server.host}") 等同于 env.getProperty("micronaut.server.host", String.class)

这将检索配置的任何内容。相反,如果您想从嵌入式服务器本身检索它,您也可以这样做,因为实际端口可能与配置的端口不同。这是因为可以简单地不配置端口,或者因为配置值为 -1,表示随机端口。