Плагин Intellij IDEA-PersistentStateComponent loadState не вызывается

Я пытаюсь разработать плагин для Intellij IDEA, я работаю с SDK 129.451.

проблема в том, что я не могу сохранить пользовательские данные, как некоторые элементы списка, которые он может ввести в плагин, и вернуть данные после перезапуска IDE..

Я использую PersistentStateComponent для сохранения данных,getState() метод, кажется, называется, но loadState() способ не поможет.

вот пример класса, который расширяет PersistentStateComponent:

    @State(name = "Test", storages = {@Storage(file = StoragePathMacros.APP_CONFIG+"/other.xml"
)})
public class Test implements PersistentStateComponent<Element> {

    String ceva;

    public Test() {
        ceva = "sad";
        System.out.println("constr");
    }

    public String getCeva() {
        return ceva;
    }

    public void setCeva(String ceva) {
        this.ceva = ceva;
    }

    public void loadState(Element state) {
        System.out.println("cstate load");

        ceva = (String) state.getContent().get(0);

    }

    public Element getState() {
        System.out.println("cstate retu");
        Element configurationsElement = new Element("testtt");
        configurationsElement.addContent(ceva);
        return configurationsElement;

    }
}

также я добавил этот класс в плагин.вот XML-код:

<extensions defaultExtensionNs="com.intellij">
    <applicationService serviceImplementation="ro.catalin.prata.testflightuploader.controller.Test"/>
    <!-- Add your extensions here -->
    <toolWindow id="TF Uploader"   secondary="true" icon="/general/add.png" anchor="right"
                factoryClass="ro.catalin.prata.testflightuploader.view.TFUploader">
    </toolWindow>
</extensions>

и у меня также есть класс окна инструмента:

public class TFUploader implements ToolWindowFactory {

    private JButton buttonAction;
    private ToolWindow myToolWindow;

    final Test test = ServiceManager.getService(Test.class);

    public TFUploader() {

        // I assume it should print the saved string but it doesn't
        System.out.println(test.getCeva());

        buttonAction.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // if I click a button I am setting some new value to the string I want to save
                test.setCeva(test.getCeva() + "-dddddd+");

            }
        });

}

Ok Итак, если я закрываю приложение или сворачиваю его, метод getState вызывается так, как я ожидал.. но когда я открываю приложение, метод loadState не вызывается.. кто-нибудь может помочь мне решить эту проблему?

Я уже прочитала этой но это не очень-то мне это помогает. Также я хочу использовать PersistentStateComponent как я хочу сохранить объекты более сложные, чем простая строка.

спасибо заранее!

3 ответов


хорошо, я сделал это! :)

Я точно не знаю, в чем проблема, но я изменил тестовый класс на это:

@State(
        name = "Test", storages = {
        @Storage(
                id = "other",
                file = "$APP_CONFIG$/testpersist.xml")
})
public class Test implements PersistentStateComponent<Test> {

    String ceva;

    public Test() {
        ceva = "sad";
        System.out.println("constr");
    }

    public String getCeva() {
        return ceva;
    }

    public void setCeva(String ceva) {
        this.ceva = ceva;
    }

    public void loadState(Test state) {
        System.out.println("cstate load");

        XmlSerializerUtil.copyBean(state, this);
    }

    public Test getState() {
        System.out.println("cstate retu");
        return this;
    }
}

и в TFUploader я изменил способ загрузки тестового класса на это:

final Test test = ServiceManager.getService(Test.class);

Я надеюсь, что это помогает другим..


Я уже прокомментировал здесь но еще раз скажу, что в моем случае loadState (состояние MyService) не был вызван из-за отсутствия геттера и сеттера для stateValue из этого примера:

class MyService implements PersistentStateComponent<MyService> {
  public String stateValue;

  public MyService getState() {
    return this;
  }

  public void loadState(MyService state) {
    XmlSerializerUtil.copyBean(state, this);
  }
}

в моем случае я получаю NullPointerException даже перед loadState был вызван. Подобно вашему коду выше, я использовал Element класс как класс состояния. У меня был конструктор с параметрами в Element класса. Это была проблема, поскольку платформа не могла создать экземпляр моего класса состояния. Я пытался добавить пустой конструктор без параметров. Это сработало.