Значение по умолчанию для свойства конфигурации Micronaut

Я не уверен, что это ошибка. Фактически это может быть ожидаемым поведением.

Предположим, у меня есть следующий класс конфигурации

@ConfigurationProperties("app")
public class ApplicationConfiguration {

    public String uri = "/api/v1";

    // I also tested with optional, no difference
    // public Optional<String> uri = Optional.of("/api/v1");
}

и я использую аннотацию @Controller("${app.uri}/some/path") на контроллере.

Если я не добавлю запись в application.yml, я получу следующую ошибку:

Could not resolve placeholder ${app.uri} in value: ${app.uri}/some/path

А если я добавлю в свой application.yml следующие строки

app:
  uri: /api/v2

Тогда все работает: заполнитель преобразуется в /api/v2, а также значение в объекте вводимой конфигурации устанавливается в /api/v2 вместо значения по умолчанию /api/v1.

Я ожидал, что, если я не установлю значение в application.yml, значение по умолчанию в классе будет разрешено (/api/v1).

Опять же, это может быть сделано намеренно, и это нормально. Мне просто интересно, делаю ли я что-то не так, и как в этом случае исправить.


person Luca Abbati    schedule 30.03.2019    source источник


Ответы (3)


Это ожидаемое поведение. Невозможно узнать, имеет ли свойство значение по умолчанию в классе конфигурации. Чтобы указать значение по умолчанию в этом контексте, просто выполните:

@Controller("${app.uri:/api/v1}/some/path")

person James Kleeh    schedule 03.04.2019
comment
Спасибо за разъяснение. Я, вероятно, не буду устанавливать значение по умолчанию на этом этапе, а просто добавлю его как обязательную опору. - person Luca Abbati; 07.04.2019

Micronaut очень основан на аннотациях, поэтому вы можете просто добавить аннотации

@Nullable

Вместе с аннотацией @Property для предотвращения ошибки компиляции.

Также в своем классе конфигурации вы делаете что-то вроде:

@ConfigurationProperties("app")
public class ApplicationConfiguration {

    @Nullable
    public String uri = "/api/v1";

    public String getUri() {
         return uril?: "/api/v1"
    }
}
person Aditya T    schedule 04.04.2019
comment
Нет, к сожалению, это не работает. И, глядя на код, становится понятно, что этот подход не должен отличаться от того, что я опубликовал. Спасибо за предложение! - person Luca Abbati; 07.04.2019
comment
Обнуляемая аннотация работает, я использую ее в своем коде, хотя я не использовал ее с аннотацией ConfigurationProperties, я напрямую использую аннотацию Property для вызова конфигураций и иногда добавляю Nullable, чтобы пометить свойства как необязательные. - person Aditya T; 08.04.2019

Просматривая последнюю документацию по конфигурации micronaut, должно работать следующее.

import io.micronaut.context.annotation.ConfigurationProperties
import javax.validation.constraints.Min import javax.validation.constraints.NotBlank

@ConfigurationProperties('my.engine')
class EngineConfig {

    @NotBlank
    String manufacturer = "Ford"

    @Min(1L)
    int cylinders
    CrankShaft crankShaft = new CrankShaft()

    @ConfigurationProperties('crank-shaft')
    static class CrankShaft {
        Optional<Double> rodLength = Optional.empty()
    }

}
person abedurftig    schedule 16.01.2020