@Value 不提供来自应用程序属性的值 Spring 引导

@Value not providing values from application properties Spring Boot

我正在使用 Springdoc 1.4 和 Spring-Boot 2.3,并且在 OperationCustomizer class 中,我需要从应用程序属性文件中读取值。但每次该字段总是初始化为 null。规格如下

application.properties

application.security.authorization=true

OperationCustomizer class

@Component
public class GlobalHeaderAdder implements OperationCustomizer {
    @Value("${application.security.authorization:true}")
    Boolean authFilterEnabled;       // <---- Initialized to NULL

    @Override
    public Operation customize(Operation operation, HandlerMethod handlerMethod) {
        System.out.println("____________________________\n" + authFilterEnabled + "\n+++++++++++++++++++++++++");
        if (authFilterEnabled) {
            operation.addParametersItem(new Parameter().$ref("#/components/parameters/ClientID"));
        }
        operation.addSecurityItem(new SecurityRequirement().addList("Authorization"));
        List<Parameter> parameterList = operation.getParameters();
        if (parameterList != null && !parameterList.isEmpty()) {
            Collections.rotate(parameterList, 1);
        }
        return operation;
    }
}

下面的代码正在调用 class

@Bean
public GroupedOpenApi hideApis() {
    return GroupedOpenApi.builder().group("default")
            .pathsToExclude("/api/v2/**", "/v2/**")
            .pathsToMatch("/api/v1/**", "/v1/**")
            .addOperationCustomizer(new GlobalHeaderAdder())
            .build();
}

提供的方法 here 有效,但我希望有一种方法,我不必将字段设为静态。

您的代码的问题是您通过调用构造函数自行启动 GlobalHeaderAdder,但在那种情况下它不是 spring bean,因此 @Value("${application.security.authorization:true}")所有其他 spring 注释将不起作用。

所以,要解决这个问题,您应该注入 GlobalHeaderAdder bean 来创建 hideApis:

@Bean
public GroupedOpenApi hideApis(GlobalHeaderAdder globalHeaderAdder) {
    return GroupedOpenApi.builder().group("default")
        .pathsToExclude("/api/v2/**", "/v2/**")
        .pathsToMatch("/api/v1/**", "/v1/**")
        .addOperationCustomizer(globalHeaderAdder)
        .build();
}

或按以下方式创建一个 bean,您将能够以上述方式注入 hideApis(对于此选项,您不需要 @Component 在 class GlobalHeaderAdder):

@Bean
public GlobalHeaderAdder globalHeaderAdder() {
    return new GlobalHeaderAdder();
}

您只需修复@Value中的值即可。
你的 class 应该是这样的:

@Component
public class GlobalHeaderAdder implements OperationCustomizer {
    @Value("${application.security.authorization}")    //<< only the name of the property, 
    Boolean authFilterEnabled;