有没有办法向下转换GWT AutoBean?

时间:2011-10-04 21:34:42

标签: java json gwt polymorphism autobean

我一直在使用AutoBeans来映射来自非GWT-RPC基于Java的Web服务的JSON数据。到目前为止,除了一个映射外,一切都在进行。

在服务器端,Class有一个Map类型的属性,其中MyAbstractParentObject是大约15个不同子类的父类。

当我将其映射到客户端上的相应AutoBean接口时,我无法在解码后将MyAbstractParentObject转发为其子类型。我查看了GWT文档和“谷歌”,看看AutoBeans是否具有多态支持,但无论如何都无法得到答案。拦截器和类别似乎无法处理这个问题,只是他们希望在接口中存在非getter / setter的方法。

我试图使用JSON数据中的type字段来创建子类的实例,但是AutoBean不允许我访问原始JSON,即使在调试器中我可以看作是受保护的字段称为“数据”。如果我尝试解码原始bean,它将只有MyAbstractParentObject中的字段。

我能看到的唯一选择是:

  1. 扩展或创建我自己的AutoBeanCodex,可以正确处理 MyAbstractParentObject的子节点解码JSON时。
  2. 找到一种方法来获取MyAbstractParentObject AutoBean中的原始JSON 并使用它来动态创建子类的实例。
  3. 切换到其他一些JSON-GWT序列化框架 GWTProJSONSerializer或piriti。
  4. 任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

我知道这是很久以前的问题,但我也很难找到答案。我意识到AutoBeans,因为它们基本上只是JSON的花哨包装器,仍然包含要将其转发到的子对象的字段的所有数据。所以我写了一个像这样的方法:

public <A, B> B cast( A sourceObject, Class<B> targetClass )
{
    AutoBean<A> sourceBean = AutoBeanUtils.getAutoBean( sourceObject ); // Get the corresponding AutoBean.
    HasSplittable splittableBean = ( HasSplittable ) sourceBean;       // Implementation (if still AbstractAutoBean) supports this interface ;)
    Splittable splittable = splittableBean.getSplittable().deepCopy(); // If you don't copy it, decode() tries to be clever and returns
                                                                       // the original bean!
    AutoBean<B> targetBean = AutoBeanCodex.decode( typeFactory, targetClass, splittable ); // Create new AutoBean of
                                                                                           // the target type.
    return targetBean.as(); // Get the proxy for the outside world.
}

- 正如您所见,typeFactory扩展了AutoBeanFactory。

它对我来说运作得很好。最棘手的一点是强制转换为HasSplittable,因为AutoBean不扩展该接口,但是AbstractAutoBean(实现AutoBean)也是如此 - 而且它的子类是调用getAutoBean()返回的内容。

你还需要复制Splittable,否则AutoBeanCodex认为,“嘿,我已经有了一个用于Splittable的AutoBean!你走了!” - 只是给你原件。 ;)

无论如何,你可以向下,向上......侧身! :P

延迟编辑:几个月之后再次磕磕绊绊,我想我会在下面提到乔纳森提到的一些警告。我在这里描述的方法旨在用于自反序列化以来未被修改的AutoBean。那是因为(AFAIK)并不能保证你调用的任何setter实际上都会更新JSON(转换所需)。这可能不是什么大问题,因为通常你会在有传入的DTO时使用它,并且你想在做任何其他事情之前尽快将它转换为真正的类型。在我们的例子中,我们的AutoBeans都没有设置setter,所以这不是一个真正的问题。 ;)

投完之后,你可以用生成的豆做任何你想要的东西,毕竟这是新鲜的!

答案 1 :(得分:0)

我对AutoBean不是很熟悉,但你可能可以使用RestyGWT的序列化器/解串器。它通过使用注释来支持多态性。

链接到文档: http://restygwt.fusesource.org/documentation/restygwt-user-guide.html#Polymorphic_Sub_Types