NotSerializableException при сериализации объектов, показанных в настоящее время Ваадином
Я получаю NotSerializableException, когда хочу сериализовать объект, который в данный момент показан Ваадином.
Структура выглядит так:
Пользовательский интерфейс Vaadin <--- serialize / deserialize --- > Hibernate/JPA Postgres База данных
Vaadin показывает объекты, которые запрашиваются из базы данных через IPC, но когда я манипулирую объектом и хочу сохранить его снова, сериализовав его и отправив на контроллер, я получаю следующее исключение:
java.io.NotSerializableException: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at java.util.LinkedList.writeObject(LinkedList.java:1118)
at sun.reflect.GeneratedMethodAccessor38.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
Я пытался:
Запрос - > манипулировать - > Сохранить | работает
Запрос - > показать в Vaadin -> манипулировать в Vaadin- > Сохранить | не работает
Почему Serializer хочет AnnotationConfigEmbeddedWebApplicationContext и есть ли обходной путь? Могу ли я удалить его заранее?
1 ответ
Компоненты Spring обычно не сериализуются (или вообще не должны быть сериализованы).
Внедрить компоненты Spring в компоненты Vaadin, связанные с пользовательским интерфейсом Vaadin, сложно, поскольку их следует объявить как transient
и повторно заселены после десериализации..
Я написал небольшую библиотеку jdal-aop, чтобы упростить процесс, используя сериализуемые прокси Spring-aop.
например
public class MainLayout extends VerticalLayout {
@Autowired
@SerializableProxy // make this Dao serializable
private CustomerDao customerDao;
}
Это может быть полезно для вас.