spring@value在嵌套配置中不起作用

dw1jzc5e  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(300)

我有一个应用程序。属性:

app.cert.identity.subject.organizationalUnit=test
app.cert.identity.subject.O=Pacific College
app.cert.identity.subject.L=CanTho
app.cert.identity.subject.ST=CanTho
app.cert.identity.subject.C=VN

我的班级:

@Configuration
@ConfigurationProperties(prefix = "app.cert.identity")
@EnableConfigurationProperties
@Data
public class IdentityCertificateDefinition {

    private Subject subject;

    @Data
    @Configuration
    public static class Subject {

        private String organizationalUnit;    //Does work

        @Value("${app.cert.identity.subject.O}")    //Does NOT work
        private String organization;

        @Value("${app.cert.identity.subject.L}")    //Does NOT work
        private String location;

        @Value("${app.cert.identity.subject.ST}")    //Does NOT work
        private String state;

        @Value("${app.cert.identity.subject.C}")    //Does NOT work
        private String countryCode;

        @Value("${app.cert.identity.validity.not-after-in-days}")    //Does NOT work
        private int notAfterInDays;

    }

}

结果如下:

你们可以看到组织单元工作,其余的不工作(都是空的)。我不知道如何使其余的属性工作。我想保留application.properties。

quhf5bfb

quhf5bfb1#

您可以对以下代码使用静态类配置:

@Configuration
@Data
public class IdentityCertificateDefinition {

    @Autowired
    private Subject subject;

    @Data
    @Configuration
    public static class Subject {

        private String organizationalUnit;

        @Value("${app.cert.identity.subject.O}")
        private String organization;

        @Value("${app.cert.identity.subject.L}")
        private String location;

        @Value("${app.cert.identity.subject.ST}")
        private String state;

        @Value("${app.cert.identity.subject.C}")
        private String countryCode;

        @Value("${app.cert.identity.validity.not-after-in-days}")
        private int notAfterInDays;
    }
}

如果不需要在配置类中使用静态类,只需使用:

@Configuration
@Data
public class IdentityCertificateDefinition {

    @Value("${app.cert.identity.subject.OU}")
    private String organizationalUnit;

    @Value("${app.cert.identity.subject.O}")
    private String organization;

    @Value("${app.cert.identity.subject.L}")
    private String location;

    @Value("${app.cert.identity.subject.ST}")
    private String state;

    @Value("${app.cert.identity.subject.C}")
    private String countryCode;

    @Value("${app.cert.identity.validity.not-after-in-days}")
    private int notAfterInDays;
}
0pizxfdo

0pizxfdo2#

问题应该与

@ConfigurationProperties(prefix = "app.cert.identity")

主要是说属性有一个公共前缀,但是当你注入它们的值时,你会再次输入前缀:

@Value("${app.cert.identity.subject.L}")

所以spring正在查找一个名为(prefix+class+value of@value)的属性:

@Value("${app.cert.identity.subject.app.cert.identity.subject.L}")

改变

@Value("${app.cert.identity.subject.L}")

@Value("${L}")

相关问题