Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot:如何在运行时获取tomcat端口?_Java_Spring_Spring Boot_Tomcat8 - Fatal编程技术网

Java Spring Boot:如何在运行时获取tomcat端口?

Java Spring Boot:如何在运行时获取tomcat端口?,java,spring,spring-boot,tomcat8,Java,Spring,Spring Boot,Tomcat8,我正在尝试使用Netflix OSS来实现微服务架构。我想在运行时从bootstrap.yml文件中记录server.port,以查看哪个实例为请求提供服务 我正在使用Java8 重要的库版本有: *spring-boot-starter-web-1.5.8 *spring-boot-starter-tomcat-1.5.8 *tomcat-embed-core-8.5.23 在浏览stackoverflow之后,我找到了,但是这些解决方案不起作用 我的bootstrap.yml如下所示: sp

我正在尝试使用Netflix OSS来实现微服务架构。我想在运行时从bootstrap.yml文件中记录
server.port
,以查看哪个实例为请求提供服务

我正在使用Java8

重要的库版本有:
*spring-boot-starter-web-1.5.8
*spring-boot-starter-tomcat-1.5.8
*tomcat-embed-core-8.5.23

在浏览stackoverflow之后,我找到了,但是这些解决方案不起作用

我的bootstrap.yml如下所示:

spring:
  application:
    name: some-service

server:
  port: ${port:8088}
我尝试了以下代码:

@SpringBootApplication
@EnableEurekaClient
@SuppressWarnings("javadoc")
public class SomeService {

    private static Logger logger  = LoggerFactory.getLogger(SomeService .class);

    @LocalServerPort
    private static int randomServerPort;

    @LocalManagementPort
    private static int randomManagementPort;

    @Autowired
    private static Environment environment;

    @Value("${server.port}")
    // @Value("${local.server.port}")
    private static int port;

    public static void main(String[] args) {
        SpringApplication.run(SomeService .class, args);

        logger.info("randomServerPort : {}", randomServerPort);
        logger.info("randomManagementPort : {}", randomManagementPort);
        logger.info("server.port : {}", port);
        logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));

}
相应的输出为:

randomServerPort : 0
randomManagementPort : 0
server.port : 0
java.lang.NullPointerException against environment.getProperty("server.port")
前三个日志语句log
0
,而最后一个则抛出一个`NullPointerException*

在运行时,端口在控制台上的日志中打印为:

s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8088 (http)

我想在
SomeService
类的
main
方法中访问此端口号。我如何才能做到这一点?

您正在尝试在Spring创建上下文之前访问上下文信息。删除静态引用,并从
@PostConstruct
块而不是主块访问数据:

@Autowired
private Environment environment;

@Value("${server.port}")
private int port;

public static void main(String[] args) {
    SpringApplication.run(SomeService .class, args);
}

@PostConstruct
public void init() {
    logger.info("server.port : {}", port);
    logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));
}

您正在尝试在Spring创建上下文之前访问上下文信息。删除静态引用,并从
@PostConstruct
块而不是主块访问数据:

@Autowired
private Environment environment;

@Value("${server.port}")
private int port;

public static void main(String[] args) {
    SpringApplication.run(SomeService .class, args);
}

@PostConstruct
public void init() {
    logger.info("server.port : {}", port);
    logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));
}

静态场不会在Spring中注入。
您需要做的是首先将其设置为实例字段。
然后,只有在Spring引导容器初始化它之后才能使用它。
在用
@PostConstruct
注释的方法中移动它们应该可以完成这项工作,因为这是在执行依赖项注入之后调用的

@SpringBootApplication
@EnableEurekaClient
@SuppressWarnings("javadoc")
public class SomeService {

    private static Logger logger  = LoggerFactory.getLogger(SomeService .class);

    @LocalServerPort
    private static int randomServerPort;

    @LocalManagementPort
    private static int randomManagementPort;

    @Autowired
    private static Environment environment;

    @Value("${server.port}")
    private int port;

    @PostConstruct
    public void postConstruct(){
        logger.info("randomServerPort : {}", randomServerPort);
        logger.info("randomManagementPort : {}", randomManagementPort);
        logger.info("server.port : {}", port);
        logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));
    }    

    public static void main(String[] args) {
        SpringApplication.run(SomeService .class, args);
    }

}

静态场不会在Spring中注入。
您需要做的是首先将其设置为实例字段。
然后,只有在Spring引导容器初始化它之后才能使用它。
在用
@PostConstruct
注释的方法中移动它们应该可以完成这项工作,因为这是在执行依赖项注入之后调用的

@SpringBootApplication
@EnableEurekaClient
@SuppressWarnings("javadoc")
public class SomeService {

    private static Logger logger  = LoggerFactory.getLogger(SomeService .class);

    @LocalServerPort
    private static int randomServerPort;

    @LocalManagementPort
    private static int randomManagementPort;

    @Autowired
    private static Environment environment;

    @Value("${server.port}")
    private int port;

    @PostConstruct
    public void postConstruct(){
        logger.info("randomServerPort : {}", randomServerPort);
        logger.info("randomManagementPort : {}", randomManagementPort);
        logger.info("server.port : {}", port);
        logger.info("environment.getProperty(\"server.port\") : {}", environment.getProperty("server.port"));
    }    

    public static void main(String[] args) {
        SpringApplication.run(SomeService .class, args);
    }

}

将服务器端口配置从bootstrap.yml移动到application.yml

application.yml

server:
  port: 8088

通常,bootstrap.yml包含两个属性:配置服务器的位置(spring.cloud.config.uri)和应用程序的名称(spring.application.name)。启动时,SpringCloud使用应用程序的名称对配置服务器进行HTTP调用,并检索该应用程序的配置。另一方面,application.yml包含标准应用程序配置—通常是默认配置,因为在引导过程中检索到的任何配置都将覆盖此处定义的配置。

将服务器端口配置从bootstrap.yml移动到application.yml

application.yml

server:
  port: 8088

通常,bootstrap.yml包含两个属性:配置服务器的位置(spring.cloud.config.uri)和应用程序的名称(spring.application.name)。启动时,SpringCloud使用应用程序的名称对配置服务器进行HTTP调用,并检索该应用程序的配置。另一方面,application.yml包含标准的应用程序配置—通常是默认配置,因为在引导过程中检索到的任何配置都将覆盖此处定义的配置。

I先前仅在application.yml中有
server.port
。但我面临的问题与上述问题中提到的相同。由于bootstrap.yml是在application.yml之前加载的,所以我认为将
server.port
移动到bootstrap.yml可能会解决这个问题。但这没有帮助。我将把
server.port
移回application.yml。我之前只在application.yml中使用了
server.port
。但我面临的问题与上述问题中提到的相同。由于bootstrap.yml是在application.yml之前加载的,所以我认为将
server.port
移动到bootstrap.yml可能会解决这个问题。但这没有帮助。我将把
server.port
移回application.yml。