Java 扩展导叶';s系列化测试

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所拥有的对象,我该怎么做呢?如果没有当地的

我正在开发一个使用Wicket 1.5和Hibernate/JPA2的大型Java应用程序。Wicket有一个标准规则,存储在会话中的对象必须实现
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;
}