Плагин 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
класса. Это была проблема, поскольку платформа не могла создать экземпляр моего класса состояния. Я пытался добавить пустой конструктор без параметров. Это сработало.