当前位置: 首页 > 知识库问答 >
问题:

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

燕烨
2023-03-14

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

我使用的是Java8。

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

在浏览了stackoverflow之后,我发现了这个和这个,但是这些解决方案都不起作用。

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")

前三个日志语句log0,而最后一个则抛出`NullPoInterException*。

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

共有1个答案

臧烨烁
2023-03-14

静态字段不在Spring中注入。
您需要做的是首先使它成为一个实例字段。
然后只有在Spring Boot容器初始化它之后才使用它。
将它们移动到用@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);
    }

}
 类似资料:
  • 我正在用Apache Camel路由为Spring Boot应用程序创建一些单元测试,使用Spock作为测试框架,我需要模拟来自另一个应用程序的响应。我为此制作了一个模拟控制器,但我需要将测试正在运行的端口注入一个属性。有没有方法获得测试正在运行的端口? 我试过 另外,是否有方法在文件中注入该随机端口?理想情况下,我需要在文件中执行以下操作: 其中端口是运行测试的随机端口。

  • 如何在运行Tomcat时获取包版本? 我尝试getClass().getPackage().GetImplementationVersion(),但这总是返回。我想这是因为我的war还没有打包,而Tomcat执行了.classes(又名分解的war)。存在于终战中,但不存在于文件夹中 java.lang.Package 相关的是在运行时获取Maven工件版本 更新。之前我已经添加了war构建的配置

  • 我有一个Spring Boot应用程序(使用嵌入式Tomcat7),并且我在中设置了,这样我就可以有一个随机端口。在服务器启动并在一个端口上运行之后,我需要能够获得所选择的端口。 我不能使用,因为它为零。这是一条看似简单的信息,那么为什么我不能从我的java代码中访问它呢?我如何访问它?

  • 我正在开发一个spring启动应用程序并编写一些junit测试。 但我发现,当我运行任何测试时,tomcat也会启动,这使得这些测试非常缓慢,浪费了很多时间。 当我开发一个SpringMvc应用程序时,junit测试可以在不启动tomcat的情况下运行,这节省了很多时间。 所以,我想问它在那里无论如何要运行启动tomcat的springstart测试?

  • 我如何获得在运行时部署我的应用程序的主机和端口,以便在我的java方法中使用它?

  • 我正在尝试在Centos tomcat7上托管一个网站,如果我在端口80上运行tomcat7,一切正常,即74.208.164.45,但如果我想使用https://74.208.164.45/,它不起作用,但如果我这样尝试https://74.208.164.45:8443/添加密钥库之后,它就可以正常工作了。 所以,我需要一种在80和https上运行tomcat的方法,即https://74.2