Java 扩展导叶';s系列化测试
我正在开发一个使用Wicket 1.5和Hibernate/JPA2的大型Java应用程序。Wicket有一个标准规则,存储在会话中的对象必须实现Java 扩展导叶';s系列化测试,java,wicket,jpa-2.0,Java,Wicket,Jpa 2.0,我正在开发一个使用Wicket 1.5和Hibernate/JPA2的大型Java应用程序。Wicket有一个标准规则,存储在会话中的对象必须实现Serializable。我们有一个额外的规则,即JPA管理的对象不能存储在会话中。相反,JPA管理的对象通过可分离的模型在每个请求上加载 使事情复杂化的是,在会话中存储实体对象是合法的,前提是它尚未被持久化。因此,我们的一些类已经实现了Serializable 如果我想扩展Wicket的序列化测试来检测JPA所拥有的对象,我该怎么做呢?如果没有当地的
Serializable
。我们有一个额外的规则,即JPA管理的对象不能存储在会话中。相反,JPA管理的对象通过可分离的模型在每个请求上加载
使事情复杂化的是,在会话中存储实体对象是合法的,前提是它尚未被持久化。因此,我们的一些类已经实现了Serializable
如果我想扩展Wicket的序列化测试来检测JPA所拥有的对象,我该怎么做呢?如果没有当地的Wicket分叉,这可能吗?在我的$dayjob中,我们使用了您描述的东西和我拥有的东西(请参见幻灯片23和其他)。你不必用叉子叉边门 基本上,您要做的是复制序列化程序检查程序代码,并对其进行修改,以包括您的检查以及检查序列化错误。然后在请求周期的最后阶段,在受影响的页面上运行自己的序列化程序检查器 我们为公共基类创建的检查,以及实体是否已持久化。如果是这样,我们的请求就失败了。此外,我们在基本页中有一个Ajax回调,它检查会话属性以查看是否存在序列化错误。如果是这样,我们将重定向到序列化失败的错误页面,以确保开发人员不会忽略页面层次结构中的实体 下面是我们的检查程序(从Wicket的序列化程序检查重写的
check
方法):
一种非常简单的方法是自定义实体的序列化:
public Object writeReplace() throws ObjectStreamException {
if (!isTransient()) {
throw new NotSerializableException("persistent objects must not be serialized");
}
return this;
}
我们已经将这个代码片段放入了我们所有的实体中(实际上是放入了一个名为AbstractPersistentObject的公共基类中),它运行得非常好。它唯一复杂的事情是编辑持久实体或具有持久属性的临时实体:不允许序列化脏的/编辑的/修改的对象。有关Wicket 6.3.0+中更简单的解决方案,请参见我已经在我的应用程序中实现了这一点,它的工作方式很有魅力。如果Wicket有一个方便的用于会话检查的附件点,那么会更整洁一些,但这是可以维护的。谢谢,不客气。您可以自由提交功能请求。不幸的是,我们不能将此作为一般检查,但是能够以更明显的方式扩展框架将是很好的。
class DetachCheckingRequestAdapter extends RequestAdapter
{
public DetachCheckingRequestAdapter(IPageManagerContext context)
{
super(context);
}
@Override
protected void storeTouchedPages(List<IManageablePage> touchedPages)
{
super.storeTouchedPages(touchedPages);
if (Application.get().usesDevelopmentConfig())
{
for (IManageablePage curPage : touchedPages)
{
if (!((Page) curPage).isErrorPage())
testDetachedObjects(curPage);
}
}
}
private void testDetachedObjects(final IManageablePage page)
{
try
{
NotSerializableException exception = new NotSerializableException();
EntityAndSerializableChecker checker = new EntityAndSerializableChecker(exception);
checker.writeObject(page);
}
catch (Exception ex)
{
log.error("Couldn't test/serialize the Page: " + page + ", error: " + ex);
Session.get().setDetachException(ex);
}
}
}
public Object writeReplace() throws ObjectStreamException {
if (!isTransient()) {
throw new NotSerializableException("persistent objects must not be serialized");
}
return this;
}