Правильный способ получить переменные среды и пройти через SonarLint

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

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

Изменение метода на статический (как рекомендует sonarLint) не работает с переменной continuous null

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 указывает на проблему Методы экземпляра не должны писать в "статические" поля.

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

Не могли бы вы добавить код, который использует класс, содержащий член accessKey. Особенно интересно создание экземпляра, который вы использовали для проверки, установлен ли accessKey или нет.

dpr 25.06.2018 15:22

Я использую внутри метода в том же классе headers.add ("ACCESSKEY", accessKey);

Manzini 25.06.2018 16:18

Если ваш класс правильно подключен к Spring и не создан вручную (например, с new MyClass()), первый фрагмент должен работать правильно. Могу только представить, что описанные проблемы возникают из-за создания bean-компонента вручную. Вот почему я прошу код, создающий экземпляр компонента.

dpr 25.06.2018 16:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
634
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Класс конфигурации (помеченный @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 (максимальная версия), сборка № IU-181.5281.24
  • SonarLint

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

Вариант (есть и другие) может заключаться в объявлении конструктора для контроллера (назовем его 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 работает правильно.

Я не понимаю, какова функция метода set, поскольку необходимая мне информация поступает из переменных среды и свойств? bws.access.key = $ {BWS_ACCESSKEY}

Manzini 25.06.2018 19:17

@Manzini Это совершенно необязательно. Я в вопросе заявил если вам нужны методы доступа для accessKey. Так что это полезно в случае, если вам нужно будет изменить значение accessKey позже, но, опять же, вы можете избавиться от него, если он вам не нужен. Я разместил его только для полноты картины.

lealceldeiro 25.06.2018 19:28

@Manzini Я добавил комментарий над методом, чтобы прояснить ситуацию.

lealceldeiro 25.06.2018 19:30

спасибо за терпение, я новичок в springboot, я видел, что ваше опубликованное решение работает отлично. Не могли бы вы привести мне пример того, как использовать метод с аннотацией bean-компонента в моем классе контроллера. Я пробовал использовать Autowired, но не смог

Manzini 25.06.2018 20:47

Пожалуйста! Если это было полезно для вас, пожалуйста, проголосовать за этот вопрос для будущих читателей и рассмотрите принимая, если вы считаете, что это лучший вопрос для вашего вопроса. С другой стороны, я не совсем уверен, что понимаю, что вы имеете в виду под ... как использовать метод с аннотацией bean в моем классе контроллера .... Вы хотите использовать код (я разместил в качестве примера в репозитории github) внутри CommandLineRunner Bean в вашем контроллере?

lealceldeiro 25.06.2018 20:58

поэтому мне нужно получить значение этой переменной accesskey, чтобы использовать его в заголовке моего сообщения headers.add ("ACCESSKEY", getAccessKey ()); // здесь я видел в вашем примере, но я не мог его правильно использовать ... Я создал класс Config, подобный вашему, я написал метод getAccesKey как Bean, но как мне использовать этот метод в моем контроллере?

Manzini 25.06.2018 21:07

Хо, теперь я понял. Хотя @Autowire должен работать, теперь это всегда правда. Вот почему команда Spring рекомендует не использовать его. Я обновлю репозиторий github и дам вам знать пример.

lealceldeiro 25.06.2018 21:17

@Manzini, пожалуйста, проверьте обновленный ответ (часть ниже (Edit) Как использовать его в контроллере) и обновленный код в Репозиторий GitHub, чтобы увидеть, как использовать его внутри контроллера.

lealceldeiro 25.06.2018 21:36

Большое спасибо, друг мой, сегодня я многому меня научил!

Manzini 25.06.2018 21:55

Другие вопросы по теме