0

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

应用程序属性

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();
}

此处提供的方法有效,但我想要一种不必使字段静态的方法。

4

2 回答 2

4

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

所以,要解决这个问题,你应该注入GlobalHeaderAdderbean 来创建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();
}
于 2020-07-10T18:29:45.907 回答
1

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

@Component
public class GlobalHeaderAdder implements OperationCustomizer {
    @Value("${application.security.authorization}")    //<< only the name of the property, 
    Boolean authFilterEnabled;
于 2020-07-10T19:04:50.303 回答