【问题标题】:@Value not providing values from application properties Spring Boot@Value 不提供来自应用程序属性 Spring Boot 的值
【发布时间】:2020-10-31 12:38:13
【问题描述】:

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

application.properties

application.security.authorization=true

OperationCustomizer 类

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

下面的代码正在调用该类

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

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

【问题讨论】:

    标签: spring spring-boot springdoc


    【解决方案1】:

    您的代码的问题是您自己通过调用构造函数启动 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(对于此选项,您不需要在GlobalHeaderAdder类下拥有@Component):

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

    【讨论】:

    • 非常感谢@Vasyl!您能否提供一些涵盖 Spring 框架基础知识的资源?
    • 也许可以尝试阅读有关 Spring 的文章,或者如果您想获得更复杂的知识,请尝试阅读《开始 Spring 5:从新手到专业人士》之类的书
    【解决方案2】:

    您只需要修复@Value 中的值。
    你的班级应该是这样的:

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

    【讨论】:

    • 不,这是不正确的。表达式@Value("${application.security.authorization:true}")表示如果没有指定这个属性,那么我们应该取true
    猜你喜欢
    • 2018-02-24
    • 2021-04-13
    • 2016-12-27
    • 1970-01-01
    • 2021-09-01
    • 2015-05-24
    • 2014-01-07
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多