gpt4 book ai didi

java - 有没有办法向下转型 GWT AutoBean?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:54 25 4
gpt4 key购买 nike

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

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

当我将其映射到客户端上相应的 AutoBean 接口(interface)时,我无法在解码后将 MyAbstractParentObject 向下转换为其子类型。我查看了所有 GWT 文档和“谷歌”,看看 AutoBeans 是否甚至具有多态支持,但无论哪种方式都无法得到答案。拦截器和类别似乎无法处理此问题,只是它们希望存在于接口(interface)中的方法不是 getters/setters。

我试图使用 JSON 数据中的类型字段来创建子类的实例,但 AutoBean 不允许我访问原始 JSON,即使在调试器中我可以将其视为名为“数据”的 protected 字段。如果我尝试解码原始 bean,它将只包含 MyAbstractParentObject 中的字段。

我能看到的唯一选择是:

  1. 扩展或创建我自己的 AutoBeanCodex 以正确处理MyAbstractParentObject 解码 JSON 时的子对象。
  2. 找到一种获取 MyAbstractParentObject AutoBean 中的原始 JSON 的方法并使用它来动态创建子类的实例。
  3. 切换到其他一些 JSON-GWT 序列化框架,例如GWTProJSONSerializer 或 piriti。

如有任何帮助,我们将不胜感激。

最佳答案

我知道很久以前有人问过这个问题,但我也很难找到答案。我意识到 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 不扩展该接口(interface),但 AbstractAutoBean(实现 AutoBean)扩展了该接口(interface)——调用 getAutoBean() 返回的是它的一个子类。

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

无论如何,您可以向下、向上……向侧面施法! :P

后期编辑:几个月后再次遇到这个问题,我想我应该对 Jonathan 在下面提到的事情添加一个小警告。我在此处描述的方法旨在用于自反序列化以来未被修改的 AutoBean。那是因为(AFAIK)不能保证您调用的任何 setter 实际上会更新 JSON(转换所需)。这可能不是什么大问题,因为通常当您有一个传入的 DTO 并且您希望在对其进行任何其他操作之前尽快将其转换为它的真实 类型时使用它。在我们的例子中,我们的 AutoBeans 甚至都没有 setter,所以这不是真正的问题。 ;)

转换后,您可以对生成的 bean 做任何您想做的事情,毕竟它是刚从工厂出来的!

关于java - 有没有办法向下转型 GWT AutoBean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com