当我想要序列化当前由Vaadin显示的Object时,我得到一个NotSerializableException。
结构是这样的:
Vaadin UI< --- 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并且有解决方法吗?我可以事先将其删除吗?
答案 0 :(得分:1)
Spring组件通常不可序列化(或根本不应序列化)。
在Vaadin UI中注入Vaadin组件中的Spring组件是很棘手的,因为它们应该声明为transient
并在反序列化后重新填充。
我使用spring-aop可序列化代理编写了一个小型库jdal-aop来简化流程。
例如
public class MainLayout extends VerticalLayout {
@Autowired
@SerializableProxy // make this Dao serializable
private CustomerDao customerDao;
}
它可能对你有用。