GOOGLE ADS

Mittwoch, 13. April 2022

Richtiger Weg, um Umgebungsvariablen abzurufen und SonarLint zu durchlaufen

Ich habe ein Problem damit, meine Umgebungsvariablen zu lesen und gleichzeitig SonarLint zu erfüllen (Erkennen und Beheben von Qualitätsproblemen). Auf diese Weise funktioniert es nicht. Meine Variable ist null

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

Wenn Sie die Methode auf statisch ändern (wie von sonarLint empfohlen), funktioniert die Variable Continuous Null nicht

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

Die einzige Möglichkeit, die ich gefunden habe, besteht darin, die Instanzvariable als statisch zu markieren, die Methode jedoch nicht als statisch zu markieren

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

Aber dort weist sonarLint auf das Problem hin, dass Instanzmethoden
nicht in "statische" Felder schreiben sollten

Ist die Art und Weise, wie ich meine Umgebungsvariablen über die Grenzen bekomme, nicht die richtige?


Lösung des Problems

Sie können den folgenden Code verwenden:

Eine Konfigurationsklasse (mit kommentiert @Component, um von Spring übernommen zu werden), die die Werte aus der Eigenschaftendatei enthält, in der Sie den Wert von bws.access.keydirekt an eine Eigenschaft binden. Und wenn Sie Zugriffsmethoden benötigen, accessKeykönnen Sie sie einfach erstellen ( setAccessKeyund 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;
}
}

Weitere Einzelheiten finden Sie in diesem GitHub-Beispielprojekt.

Ich habe das mit getestet


  • IntelliJ IDEA 2018.1.5 (Ultimate Edition), Build-Nr. IU-181.5281.24

  • SonarLintGeben Sie hier die Bildbeschreibung ein


( Bearbeiten ) So verwenden Sie es in einem Controller:

Eine Option (es gibt noch andere) könnte darin bestehen, einen Konstruktor für den Controller zu deklarieren (nennen wir ihn SampleController) und einen Parameter vom Typ ConfigClassdarin anzufordern. Nun setzen wir ein Controller-Attribut ( config) gleichen Typs auf den als Parameter erhaltenen Wert, etwa so:

@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
}
}

Jetzt versucht Spring Boot, eine Komponente (jeglicher Art) in der App des Typs zu finden, ConfigClassund da wir eine definiert haben, wird sie automatisch in unseren Controller eingefügt. Auf diese Weise können Sie die Controller-Eigenschaft des Parameters zur späteren Verwendung configauf den empfangenen Wert setzen.configClass

Um es zu testen, können Sie die URL anfordern test. Sie werden sehen, dass die Ausgabe sein wird anotherValue. Wir können also den Schluss ziehen, dass der Abhängigkeitsinjektionsmechanismus erfolgreich eine Instanz von gefunden hat ConfigClassund die Methode ConfigClass#getAccessKeyordnungsgemäß funktioniert.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...