- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在使用 AutoBeans 映射来自非 GWT-RPC 基于 Java 的 Web 服务的 JSON 数据。到目前为止一切正常,除了一个映射。
在服务器端,Class 有一个 Map 类型的属性,其中 MyAbstractParentObject 是大约 15 个不同子类的父类。
当我将其映射到客户端上相应的 AutoBean 接口(interface)时,我无法在解码后将 MyAbstractParentObject 向下转换为其子类型。我查看了所有 GWT 文档和“谷歌”,看看 AutoBeans 是否甚至具有多态支持,但无论哪种方式都无法得到答案。拦截器和类别似乎无法处理此问题,只是它们希望存在于接口(interface)中的方法不是 getters/setters。
我试图使用 JSON 数据中的类型字段来创建子类的实例,但 AutoBean 不允许我访问原始 JSON,即使在调试器中我可以将其视为名为“数据”的 protected 字段。如果我尝试解码原始 bean,它将只包含 MyAbstractParentObject 中的字段。
我能看到的唯一选择是:
如有任何帮助,我们将不胜感激。
最佳答案
我知道很久以前有人问过这个问题,但我也很难找到答案。我意识到 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/
我正在使用面部跟踪进行 HCI(人机交互)。我正在尝试使用面部控制 PC。 我有 3x3 二维网格按钮。1 2 34 5 67 8 9 假设,当前焦点在按钮 5 上。如果我按向上箭头,则焦点将在 2
我正在为蛇和梯子制作一 block 板,到目前为止,我已经按降序打印了板。但是,我需要以正确的方式打印电路板。 编辑“螺旋下降”意味着 100...91 81...90 80...71 ...
我有一个可以响应式调整大小的菜单,因此每次调整大小时 div (#menuWFhover) 的内容都会重新排列,因此 div 根据窗口大小具有不同的高度。 当我使用 jQuery slideDown/
我们从服务器获取数据并附加 ListView 。我们的问题是,当向上/向下滚动时,它首先显示白屏,然后显示数据。向下/向上滚动时,之前出现的白屏应删除 for (var i=0; i");
我想要一个汉堡图标动态改变颜色的代码,以适应网站的黑色部分/部分和白色。它最初是 3 段白色,js 代码几乎是好的和正确的,但是当它在白色部分时它一直闪烁,并在红色和白色之间闪烁。 js var to
我对点击事件的页脚位置有疑问。我正在使用 bootstrap css,我有一个可折叠元素(bootstrap 中的 Accordion ),当它折叠时它有一个名为 .accordion-toggle.
在此代码段中,使用关键帧和动画并显示无/ block ,div 动画以在悬停时向下滑动。 h1 { padding: 20px; } div { width: 100%; background
我需要对一个 float 进行四舍五入。例如 4.00011 。内置函数 round() 总是在数字 > .5 时向上舍入,在 = 0 val *= 10 ** precision r
我正在尝试就地缩小文件。 我正在用另一个文件的内容替换一个文件的内容,完成后我想确保源文件是否小于目标文件,目标文件是否正确收缩。 (为什么:因为dest文件是一个备份,写入media的开销很大,所以
似乎每当我用一个负整数除以一个正整数时,我都需要它向下舍入 (向 -inf),而不是向 0。但 C# 和 C++ 都向 0 舍入。 所以我想我需要一个 DivideDownward() 方法。我可以用
考虑这个简单的代码: document.addEventListener( 'keypress', function() { console.log( 'press' ); } ); document
有什么方法可以检查 Azure 资源(例如 Azure IoT 中心或事件中心)是否可用。我所说的可用是指它是否已关闭/工作/正常/启动?我是 Azure 的新手,如果有人能提供一些启发,那就太好了。
有什么方法可以检查 Azure 资源(例如 Azure IoT 中心或事件中心)是否可用。我所说的可用是指它是否已关闭/工作/正常/启动?我是 Azure 的新手,如果有人能提供一些启发,那就太好了。
我见过几个recyclerview的无限滚动示例,但它们都是向下滚动的。 我想要的是一次又一次地加载我的列表,但无论用户是从上面还是从下面滚动。 正常列表 向上滚动 向下滚动 这样可以通过无限滚动一遍
我正在使用带有 View 的 drupal 7,并且我正在使用我发现的向上/向下文本幻灯片的 jquery 脚本。它有效,但是当我尝试将它与带有 ajax 的 View 公开过滤器一起使用时,它似乎不
*场景 我希望制作一个类似于本网站上的 jquery 效果,它位于主 Flash 添加的右侧: http://www.commbank.com.au/ *问题 我已经开始了,但是用很多方法遇到了一些障
互联网。如果这与其他人没有什么关系,请原谅我,但我会将其留在这里,以防这是一个有效的问题。 我正在尝试创建一个文本区域字段,其中用户每次按下键(a-z),都会触发背景颜色更改(在数组中列出)。我一直在
我正在创建一个网络前端来控制一个小型机器人。 Ajax 调用将在 keydown 上进行,以启动机器人,并在 keyup 上进行停止。 我的问题是,当按下某个键时,keyup、keydown 和 ke
我在内容容器中有两个 div,一个向左浮动,另一个向右浮动。我正在使用屏幕的整个宽度。左 div 宽度为 1290px,右 div 宽度为 625px。有时,在加载页面时,滚动条会更改可用屏幕宽度的宽
请看这个UI sketch图片,我在某个站点的侧边栏(黑框)中有这个 div,当我向下滚动或向上滚动时,我不希望它隐藏...我希望它在我向下滚动和移动时自行向下移动当我向上滚动时向上滚动,这样它就永远
我是一名优秀的程序员,十分优秀!