我正在构建一个JSF应用程序。 JSF应用程序包含一些CDI bean,用于保存会话数据。我想将此会话数据保存到文件中,并在以后加载它。
示例1:
@SessionScoped
MyBean implements Serializable {
private String myValue;
//getter and setters
}
@RequestScoped
MyLoadingService {
@Inject
private MyBean myBean;
public void load(byte[] data){
MyBean newMyBean = (MyBean)org.apache.commons.lang3.SerializationUtils.deserialize(data);
//this doesn't work, because myBean is a proxy here...
//how can I achieve this to work?
myBean = newMyBean;
}
}
示例2:
会话范围的bean,它包含另一个应该加载的bean。
@SessionScoped
AnotherBean implements Serializable {
private String otherValue;
//getter and setters
}
@SessionScoped
MyBean implements Serializable {
@Inject
AnotherBean anotherBean;
private String myValue;
//getter and setters
}
@RequestScoped
MyLoadingService {
@Inject
private MyBean myBean;
public void load(byte[] data){
MyBean newMyBean = (MyBean)org.apache.commons.lang3.SerializationUtils.deserialize(data);
//this doesn't work, because myBean is a proxy here...
//how can I achieve this to work?
myBean = newMyBean;
}
}
这可能吗?
答案 0 :(得分:0)
无论您使用哪种框架,该类都可以序列化或不序列化。 CDI和JSF与您的问题无关。只要确保您的类及其所有字段都可以序列化/反序列化,如果您有一个无法序列化的字段,则将其标记为transient
并通过实现{{1}建立规则以在对象反序列化上创建它方法。
注意:有些应用程序服务器为您启用此选项:将会话数据存储在磁盘中的文件中,以便在应用程序重新部署(如JBoss之后)后加载它(我在JBoss AS 7中测试了此行为)。没有必要重新发明轮子。