Как добавить файлы в /info endpoint в spring программно?
Как я могу добавить объекты в конечную точку /info
в Spring Загрузка программно? В документации указано, что это возможно для конечной точки /health
с использованием интерфейса HealthIndicator
. Есть ли что-то для конечной точки /info
?
Я хотел бы добавить имя и версию операционной системы и другую информацию о времени выполнения.
Ответы
Ответ 1
В Spring Boot 1.4 вы можете объявить InfoContributer
beans, чтобы сделать это намного проще:
@Component
public class ExampleInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("example",
Collections.singletonMap("key", "value"));
}
}
Подробнее см. http://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/htmlsingle/#production-ready-application-info-custom.
Ответ 2
Один из способов сделать то, что вы хотите (в случае, если у вас есть полностью настраиваемые свойства, которые вам нужно отобразить) заключается в объявлении bean типа InfoEndpoint, который переопределит значение по умолчанию.
@Bean
public InfoEndpoint infoEndpoint() {
final LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
map.put("test", "value"); //put whatever other values you need here
return new InfoEndpoint(map);
}
Как вы можете видеть из приведенного выше кода, карта может содержать любую информацию, которая вам нужна.
В случае, если данные, которые вы хотите показать, могут быть извлечены средой и не являются настраиваемыми, вам не нужно переопределять InfoEndpoint
bean, но вы можете просто добавить свойства в файл свойств с помощью префикс info
. Одним из примеров, где оценивается имя ОС, является следующее:
info.os = ${os.name}
В приведенном выше коде Spring Boot проверит правильное выражение перед возвратом свойства в конечной точке /info
.
Последнее замечание состоит в том, что существует тонна информации об окружающей среде, которая уже доступна в конечной точке /env
Обновление
Как указано @shabinjo, в новых версиях Spring Boot нет конструктора InfoEndpoint
, который принимает карту.
Однако вы можете использовать следующий фрагмент:
@Bean
public InfoEndpoint infoEndpoint() {
final Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("test", "value"); //put whatever other values you need here
return new InfoEndpoint(new MapInfoContributor(map));
}
Приведенный выше код полностью переопределит информацию по умолчанию, которая завершится в /info
.
Чтобы преодолеть эту проблему, можно добавить следующие bean
@Bean
public MapInfoContributor mapInfoContributor() {
return new MapInfoContributor(new HashMap<String, Object>() {{
put("test", "value");
}});
}
Ответ 3
Принятый ответ на самом деле clobbers InfoEndpoint и не добавляет к нему.
Один из способов, который я нашел добавить в информацию, - это класс @Configuration
, добавить метод @Autowired
, который добавляет дополнительные свойства в соответствии с соглашениями info.*
для среды. Затем InfoEndpoint
будет вызывать их при его вызове.
Вы можете сделать что-то вроде следующего:
@Autowired
public void setInfoProperties(ConfigurableEnvironment env) {
/* These properties will show up in the Spring Boot Actuator /info endpoint */
Properties props = new Properties();
props.put("info.timeZone", ZoneId.systemDefault().toString());
env.getPropertySources().addFirst(new PropertiesPropertySource("extra-info-props", props));
}
Ответ 4
Должно быть возможно добавить пользовательский PropertySource внутри ApplicationListener для добавления пользовательской информации. * свойства в среду (см. этот ответ для примера: Как переопределить Spring - boot application.properties программно)