@Value не предоставляет значения из свойств приложения Spring Boot - PullRequest
0 голосов
/ 10 июля 2020

Я использую Springdo c 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();
}

Предлагаемый подход здесь работает, но я хотел бы иметь подход, при котором мне не нужно делать поле stati c.

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

проблема с вашим кодом заключается в том, что вы инициируете GlobalHeaderAdder самостоятельно, вызывая конструктор, но в этом случае это не компонент Spring, и в результате @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 в классе GlobalHeaderAdder):

@Bean
public GlobalHeaderAdder globalHeaderAdder() {
    return new GlobalHeaderAdder();
}
1 голос
/ 10 июля 2020

Вам просто нужно исправить значение в @Value.
Ваш класс должен быть таким:

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