Подтвердить что ты не робот

Как добавить файлы в /info endpoint в spring программно?

Как я могу добавить объекты в конечную точку /info в Spring Загрузка программно? В документации указано, что это возможно для конечной точки /health с использованием интерфейса HealthIndicator. Есть ли что-то для конечной точки /info?

Я хотел бы добавить имя и версию операционной системы и другую информацию о времени выполнения.

4b9b3361

Ответ 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));
}