У меня проблема с чтением переменных среды и одновременным удовлетворением 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 указывает на проблему Методы экземпляра не должны писать в "статические" поля.
Разве это не тот способ, которым я получаю переменные среды через границы, неправильный?
Я использую внутри метода в том же классе headers.add ("ACCESSKEY", accessKey);
Если ваш класс правильно подключен к Spring и не создан вручную (например, с new MyClass()), первый фрагмент должен работать правильно. Могу только представить, что описанные проблемы возникают из-за создания bean-компонента вручную. Вот почему я прошу код, создающий экземпляр компонента.




Вы можете использовать следующий код:
Класс конфигурации (помеченный @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.
Я тестировал это с
(Редактировать) Как использовать его в контроллере:
Вариант (есть и другие) может заключаться в объявлении конструктора для контроллера (назовем его 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 Это совершенно необязательно. Я в вопросе заявил если вам нужны методы доступа для accessKey. Так что это полезно в случае, если вам нужно будет изменить значение accessKey позже, но, опять же, вы можете избавиться от него, если он вам не нужен. Я разместил его только для полноты картины.
@Manzini Я добавил комментарий над методом, чтобы прояснить ситуацию.
спасибо за терпение, я новичок в springboot, я видел, что ваше опубликованное решение работает отлично. Не могли бы вы привести мне пример того, как использовать метод с аннотацией bean-компонента в моем классе контроллера. Я пробовал использовать Autowired, но не смог
Пожалуйста! Если это было полезно для вас, пожалуйста, проголосовать за этот вопрос для будущих читателей и рассмотрите принимая, если вы считаете, что это лучший вопрос для вашего вопроса. С другой стороны, я не совсем уверен, что понимаю, что вы имеете в виду под ... как использовать метод с аннотацией bean в моем классе контроллера .... Вы хотите использовать код (я разместил в качестве примера в репозитории github) внутри CommandLineRunner Bean в вашем контроллере?
поэтому мне нужно получить значение этой переменной accesskey, чтобы использовать его в заголовке моего сообщения headers.add ("ACCESSKEY", getAccessKey ()); // здесь я видел в вашем примере, но я не мог его правильно использовать ... Я создал класс Config, подобный вашему, я написал метод getAccesKey как Bean, но как мне использовать этот метод в моем контроллере?
Хо, теперь я понял. Хотя @Autowire должен работать, теперь это всегда правда. Вот почему команда Spring рекомендует не использовать его. Я обновлю репозиторий github и дам вам знать пример.
@Manzini, пожалуйста, проверьте обновленный ответ (часть ниже (Edit) Как использовать его в контроллере) и обновленный код в Репозиторий GitHub, чтобы увидеть, как использовать его внутри контроллера.
Большое спасибо, друг мой, сегодня я многому меня научил!
Не могли бы вы добавить код, который использует класс, содержащий член accessKey. Особенно интересно создание экземпляра, который вы использовали для проверки, установлен ли accessKey или нет.