我有以下HealthIndicator:
@Component
public class FooBarHealthIndicator implements HealthIndicator {
// ...
生产中的结果为JSON,例如:
status "DOWN"
details
fooBar
status "DOWN"
但是在我的集成测试中,JSON看起来像
status "DOWN"
details
com.acme.fooBar
status "DOWN"
记下软件包路径。
所以我的问题是:谁负责在/health
JSON中命名HealthIndicators?而且(如何配置)?
PS:我已经将名称传递给@Component
:
@Component("fooBar") // name clash!!
public class FooBarHealthIndicator implements HealthIndicator {
// ...
起到了作用,但是当FooBarHealthIndicator
监视类FooBar
时,已经存在该名称的bean。但是,由于它可以在生产中使用而无需命名HealthIndicator
,因此必须有其他方法...
答案 0 :(得分:2)
注意:这种方法依赖于内部实现的利用,这种内部实现将来可能会发生变化。您已被警告。
负责命名运行状况指示器的类称为HealthIndicatorNameFactory
,在Spring Boot 2.0.5中看起来像这样。RELEASE:
public class HealthIndicatorNameFactory implements Function<String, String> {
@Override
public String apply(String name) {
int index = name.toLowerCase(Locale.ENGLISH).indexOf("healthindicator");
if (index > 0) {
return name.substring(0, index);
}
return name;
}
}
这意味着,如果将@Component
命名为(例如)@Component("fooBarHealthIndicator")
,那么您应该能够顺利通过,而不会出现任何bean名称冲突。当Spring在为您的bean接线时,而不是由执行器本身,会发生名称冲突。