我有一个Serializable Bean类,该类由dozerMapper
的接口实例MapperIF
组成。在将PersistentManager
添加到tomcat服务器的context.xm文件中之前,一切工作正常。使用PersistentManager
,我将会话中的所有对象作为文件存储到文件夹中。但是在我添加了PersistentManager
之后,由于Bean类中的MapperIF接口,它开始抛出NotSerializableException
。在MapperIF中添加关键字transient
可以解决NotSerializableException
的问题,但是最终它以NullPointerException
结尾,因为以下代码中的dozerMapper.map变为null。那么我该如何处理序列化我的bean类的情况。
@Autowired
private transient MapperIF dozerMapper;
public Preferences getUiPreferences() {
if (this.uiPreferences == null) {
this.uiPreferences = ((Preferences) this.dozerMapper.map(
getPrefernces(), Preferences.class));
}
return this.uiPreferences;
}
答案 0 :(得分:0)
MapperIF
接口(或其Dozer 5.x替代品Mapper
)未扩展Serializable
。它的标准实现类也不实现它。因此,标准实现将无法序列化。
我可以想办法解决这个问题:
请勿将MapperIF
引用放入保存在会话中的对象中。它并不真正属于那里。这是DozerBeanMapper
类的javadocs所说的:
应在应用程序中将其用作/定义为单例。此类执行一次一次性初始化并加载自定义xml映射,因此出于性能原因,您将不想创建它的许多实例。通常,一个系统每个VM仅具有一个
DozerBeanMapper
实例。如果您使用的是IOC框架(例如Spring),则将Mapper定义为singleton =“ true”。如果您不使用IOC框架,则推土机jar中将提供一个DozerBeanMapperSingletonWrapper
便利类。
这意味着您不需要 将MapperIF
对象放入会话中。
将字段声明为transient
并实现自定义readObject
的方法,该方法将在反序列化时从某个地方重新填充该字段。
实现您自己的可序列化的自定义MapperIF
/ Mapper
类。 (我没看过,但这可能是很多工作……或不可能。)