Я хочу иметь неизменный класс свойств со всеми полями по умолчанию. Включить собственность в библиотеку. Я могу создать класс неизменяемого свойства с простым типом по умолчанию, но я не могу с комплексным типом. Есть ли способ установить значение по умолчанию для сложного типа в неизменяемый класс ConfigurationProperties?
import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;
@ConfigurationProperties(prefix = "foo")
@ConstructorBinding
@Getter
public final class AnyProperties {
private final String something
private final AnySubProperties sub;
public AnyProperties(
@DefaultValue("foo") String something,
AnySubProperties sub // Any annotation here ? Like @DefaultValue
) {
this.something = something;
this.sub = sub; // Always null !
}
@Getter
public static final class AnySubProperties {
private String finalValue;
public AnySubProperties(@DefaultValue("bar") String finalValue) {
this.finalValue = finalValue;
}
}
}
В примере sub
равно null
, если не определены свойства (с yaml
или property file
) .
Я хотел бы иметь sub
с установленным finalValue
(с баром value
).
Спасибо за ответы.
РЕДАКТИРОВАТЬ с решением без аннотации
Я нахожу решение без аннотации, но я ленивый мальчик, вот почему не возможно найти решение с аннотацией пружины?
import lombok.Getter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;
@ConfigurationProperties(prefix = "foo")
@ConstructorBinding
@Getter
public final class AnyProperties {
private final String something
private final AnySubProperties sub;
@ConstructorBinding
public AnyProperties(
@DefaultValue("foo") String something,
AnySubProperties sub // Any annotation here ? Like @DefaultValue
) {
this.something = something;
this.sub = null != sub ? sub : new AnySubProperties();
}
@Getter
public static final class AnySubProperties {
private static final String DEFAULT_FINAL_VALUE = "bar";
private String finalValue;
public AnySubProperties() {
this(DEFAULT_FINAL_VALUE);
}
@ConstructorBinding
public AnySubProperties(@DefaultValue(DEFAULT_FINAL_VALUE) String finalValue) {
this.finalValue = finalValue;
}
}
}