2016-07-20 1 views
1

Я пытаюсь получить доступ к Property в классе, расширяющем RulesDefinition моего плагина SonarQube. я определяю, что недвижимость в классе, простирающийся SonarPlugin с:SonarQube получить свойство в RulesDefinition

@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 и может подтвердить, что указанные значения являются те, установленные на веб-странице, но если я обеспечиваю значение по умолчанию (как указано выше), журнал показывает defau lt, а не значение, введенное на веб-странице (и показано через веб-службу).

Возможно, проблема в том, как я получаю объект Settings. Был бы признателен за предоставленную помощь. Спасибо заранее.

ответ

3

Компонент Настройка инстанциируется ядром и должна быть введена в вашем объекте с помощью параметра конструктора:

public class YourRulesDefinition implements RulesDefinition { 
    private final Settings settings; 

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

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

Обратите внимание, что вы никогда не должны инстанцированную базовые классов. Они всегда доступны через инъекцию конструктора.

+0

Благодарим вас за ответ. Я попробую завтра, и я предоставлю отзыв. У меня не было конструктора в этом классе, потому что мне не нужно было. Если я создам его, как вы предлагаете, движок SonarQube автоматически получит доступ к нему с помощью инстанцированной информации, так ли это? Кроме того, должен ли я содержать 'Property'definition в классе, расширяющем« SonarPlugin »? Спасибо. – jonypera

+0

да и да (но [PropertyDefinition] (http://javadocs.sonarsource.org/5.6/apidocs/index.html?org/sonar/api/config/PropertyDefinition.html) является предпочтительным) –

+0

Спасибо, друг, работал довольно хороший. – jonypera

Смежные вопросы