我正在尝试在扩展SonarQube插件的Property的类中访问RulesDefinition
我在扩展SonarPlugin的类中定义该Property:

@Properties(
    @Property(key="sonar.root.path", name="Path to installation", description = "Root directory of the Master plugin installation directory")
)


属性已正确创建,并在SQ的配置页中设置了它的值,但是以某种方式,我无法通过覆盖了RulesDefinition方法中的以下代码从扩展了define(Context context)的类中访问它:

// Get access to the Properties
Settings settings = new Settings(new PropertyDefinitions(new MyPlugin()));
if(settings.hasKey("sonar.root.path")) {
    // Never enters here
    String path = settings.getString("sonar.root.path");
} else {
    // If always returns false and enters here
    LOG.info("No property defined with the provided key.");
}

// To double-check
LOG.info("The value: " + settings.getString("sonar.root.path"));   // Returns null

LOG.info("Has default value: " + settings.hasDefaultValue("sonar.root.path"));
// Returns false, or true if I provide a default value, proving it can
    // access the property - so the if condition above should have returned true


奇怪的是,我已经通过REST Web服务检查了Property,并且可以确认显示的值是网页中设置的值,但是如果我提供默认值(如上述),则日志将显示默认值值,而不是在网页中输入(通过Web服务显示)的值。

也许问题出在我获取Settings对象的方式上。希望提供的任何帮助。
提前致谢。

最佳答案

组件Settings是由内核实例化的,必须通过构造函数参数注入到您的对象中:

public class YourRulesDefinition implements RulesDefinition {
  private final Settings settings;

  public YourRulesDefinition(Settings s) {
    this.settings = s;
  }

  void yourMethod() {
    if(settings.hasKey("sonar.root.path")) {
      // ...
    }
  }
}


请注意,您永远不要实例化核心类。它们始终可以通过构造函数注入获得。

关于java - SonarQube在RulesDefinition中获取属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38484546/

10-09 16:37