Правильный способ получить переменные окружения и пройти через SonarLint - PullRequest
0 голосов
/ 25 июня 2018

У меня проблема с чтением переменных среды и одновременным удовлетворением SonarLint (обнаружение и устранение проблем с качеством). Таким образом, это не работает, моя переменная равна нулю

 private String accessKey;
 @Value("${bws.access.key}")
public void setAccessKey(String ak){
    accessKey=ak;
}

При изменении метода на статический (как рекомендует sonarLint) переменная непрерывная нуль

не работает
private static String accessKey;
  @Value("${bws.access.key}")
public static void setAccessKey(String ak){
    accessKey=ak;
}

Единственный способ, который я нашел для работы, - пометить переменную экземпляра как статическую, но не помечать метод как статический

private static String accessKey;
  @Value("${bws.access.key}")
public void setAccessKey(String ak){
    accessKey=ak;
}

Но там sonarLint указывает на проблему Методы экземпляра не должны записывать в «статические» поля

Разве я не получаю, что мои переменные окружения выходят за границы, не правильные?

1 Ответ

0 голосов
/ 25 июня 2018

Вы можете использовать следующий код:

Класс конфигурации (помеченный @Component для выбора Spring), который будет содержать значения, поступающие из файла свойств, где вы напрямую связываете значение bws.access.key со свойством. А если вам нужны методы доступа для accessKey, вы можете просто создать их (setAccessKey и getAccessKey)

@Component
public class ConfigClass {

    // @Value("${bws.access.key:<no-value>}")  // <- you can use it this way if you want a default value if the property is not found
    @Value("${bws.access.key}")                // <- Notice how the property is being bind here and not upon the method `setAccessKey`
    private String accessKey;

    // optional, in case you need to change the value of `accessKey` later
    public void setAccessKey(String ak){
        this.accessKey = ak;
    }

    public String getAccessKey() {
        return this.accessKey;
    }

}

Для более подробной информации ознакомьтесь с примером проекта GitHub .

Я проверял это с

  • IntelliJ IDEA 2018.1.5 (Ultimate Edition), сборка № IU-181.5281.24
  • SonarLint enter image description here

( Редактировать ) Как использовать его в контроллере :

Опция (есть и другие) может состоять в том, чтобы объявить конструктор для контроллера (назовем его SampleController) и запросить параметр типа ConfigClass внутри него. Теперь мы устанавливаем атрибут контроллера (config) того же типа на значение, полученное в качестве параметра, например:

@RestController
public class SampleController {

    private final ConfigClass config;

    public SampleController(ConfigClass configClass) { // <- request the object of type ConfigClass
        this.config = configClass; // <- set the value for later usage
    }

    @RequestMapping(value = "test")
    public String test() {
        return config.getAccessKey();  // <- use the object of type ConfigClass
    }
}

Теперь Spring Boot попытается найти компонент (любого типа) в приложении типа ConfigClass, и, поскольку у нас есть такой компонент, он автоматически внедрит его в наш контроллер. Таким образом, вы можете установить для свойства контроллера параметра config значение, полученное в configClass для последующего использования.

Чтобы проверить это, вы можете запросить URL test. Вы увидите, что на выходе будет anotherValue. Таким образом, мы можем сделать вывод, что механизм внедрения зависимостей успешно нашел экземпляр ConfigClass и метод ConfigClass#getAccessKey работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...