@ConfigurationProperties 引用本身引用其他属性的属性

@ConfigurationProperties referencing properties that themselves reference other properties

project.name=my-project
base.url=http://localhost:8080
cas.url=http://my-server:8010/cas
cas.callback.url=${base.url}/${project.name}

基本上我想在 spring-boot ConfigurationProperties 中使用上面的内容,但 casCallbackUrl 始终为 null。

@Component
@ConfigurationProperties(prefix = "cas")
@Getter
@Setter
public class CasSettings {

    @NotBlank
    private String url; //this is resolved correctly

    @NotBlank
    private String callbackUrl; //callbackUrl is null

}

更新

好吧,我通过 属性 名称的驼峰式拼接得到它的工作,但根据 documentation 你应该能够对 属性 名称使用点符号。

来自:

cas.callback.url=${base.url}/${project.name}

至:

cas.callbackUrl=${base.url}/${project.name}

为什么 spring-boot 没有选择点符号?

圆点表示配置属性对象中的一个单独对象。 cas.callback-url 会起作用。

Spring 宽松 属性 不够宽松,无法将点标记属性转换为驼峰式字段。但是你可以很容易地自己实现它:

@Service
@PropertySource("classpath:git.properties")
public class MngmntService implements EnvironmentAware {

    private BuildStatus buildStatus;
    private static final Logger LOG = LoggerFactory.getLogger(MngmntService.class);

    @Override
    public void setEnvironment(Environment env) {
        RelaxedPropertyResolver pr = new RelaxedPropertyResolver(env, "git.");
        buildStatus = new BuildStatus();
        for (Field field : BuildStatus.class.getDeclaredFields()) {
            String dotNotation = StringUtils.join(
                StringUtils.splitByCharacterTypeCamelCase(field.getName()),
                '.'
            );
            field.setAccessible(true);
            try {
                field.set(buildStatus, pr.getProperty(dotNotation, field.getType()));
            } catch (IllegalArgumentException | IllegalAccessException ex) {
                LOG.error("Error setting build property.", ex);
            }
        }
    }

    public BuildStatus getBuildStatus() {
        return buildStatus;
    }

属性 对象:

public class BuildStatus implements Serializable {

    private String tags;
    private String branch;
    private String dirty;

    private String commitId;
    private String commitIdAbbrev;
    private String commitTime;

    private String closestTagName;

    private String buildTime;
    private String buildHost;
    private String buildVersion;
    ...
}