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

时间:2015-03-17 23:03:47

标签: spring-boot

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

}

更新

嗯,我通过camelCasing属性名称来实现它,但是根据documentation,您应该能够使用点表示法来表示属性名称。

从:

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

为:

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

为什么spring-boot没有采用点符号?

2 个答案:

答案 0 :(得分:2)

点表示配置属性对象中的单独对象。 cas.callback-url会奏效。

答案 1 :(得分:0)

春天放松的属性并不轻松将点标记属性转换为驼峰案例字段。但你可以轻松地自己实现它:

@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;
    ...
}