gpt4 book ai didi

spring - 当management.port=0时,在运行时获取Spring Boot管理端口

转载 作者:行者123 更新时间:2023-12-02 03:33:15 60 4
gpt4 key购买 nike

我正在寻求有关如何在设置 management.port 时获取分配给为执行器端点提供服务的嵌入式 Tomcat 的端口的建议。属性至0在集成测试中。

我正在使用 Spring Boot 1.3.2 和以下 application.yml配置:

server.port: 8080
server.contextPath: /my-app-context-path

management.port: 8081
management.context-path: /manage

...

然后我的集成测试用 @WebIntegrationTest 进行注释,将上面显示的端口设置为 0 :

@WebIntegrationTest({ "server.port=0", "management.port=0" })

在进行完整集成测试时,应使用以下实用程序类来访问应用程序配置:

@Component
@Profile("testing")
class TestserverInfo {

@Value( '${server.contextPath:}' )
private String contextPath;

@Autowired
private EmbeddedWebApplicationContext server;

@Autowired
private ManagementServerProperties managementServerProperties


public String getBasePath() {
final int serverPort = server.embeddedServletContainer.port

return "http://localhost:${serverPort}${contextPath}"
}

public String getManagementPath() {
// The following wont work here:
// server.embeddedServletContainer.port -> regular server port
// management.port -> is zero just as server.port as i want random ports

final int managementPort = // how can i get this one ?
final String managementPath = managementServerProperties.getContextPath()

return "http://localhost:${managementPort}${managementPath}"
}
}

我已经知道可以通过使用 local.server.port 来获取标准端口并且似乎有一些名为 local.management.port 的管理端点等效项。但这句话似乎有不同的含义。 official documentation没有提到执行此操作的方法。

目前是否有任何未记录的方法来获取该管理端口?

<小时/>

解决方案编辑

因为我正在使用 Spock Frameworkspock-spring用于测试我的 Spring Boot 应用程序的模块,我必须像这样初始化应用程序:

@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = MyApplication.class)

不知何故,spock-spring 或测试初始化​​似乎会影响 @Value 的评估注释这样 @Value("${local.management.port}")结果是

java.lang.IllegalArgumentException: Could not resolve placeholder'local.management.port' in string value "${local.management.port}"

通过您的解决方案,我知道该属性存在,因此我只需使用 Spring Environment直接在测试运行时检索属性值:

@Autowired
ManagementServerProperties managementServerProperties

@Autowired
Environment environment

public String getManagementPath() {
final int managementPort = environment.getProperty('local.management.port', Integer.class)
final String managementPath = managementServerProperties.getContextPath()

return "http://localhost:${managementPort}${managementPath}"
}

最佳答案

管理端口需要通过@SpringBootTest的属性字段设置为0,然后在测试中使用@LocalServerPort和/或获取端口>@LocalManagementPort 注释。

示例:

从 Spring Boot 2.0.0 开始:
properties = {"management.server.port=0"}

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {
"management.server.port=0" })
public class HealthCheckIT {

@Autowired
private WebTestClient webTestClient;

@LocalManagementPort
int managementPort;

@Test
public void testManagementPort() {
webTestClient
.get().uri("http://localhost:" + managementPort + "/actuator/health")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.accept(MediaType.APPLICATION_JSON)
.exchange()
.expectStatus().isOk();
}
}

对于旧版本:[1.4.0 - 1.5.x]:
properties = {"management.port=0"}

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = {
"management.port=0", "management.context-path=/admin" })
public class SampleTest {

@LocalServerPort
int port;

@LocalManagementPort
int managementPort;

关于spring - 当management.port=0时,在运行时获取Spring Boot管理端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567207/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com