我可以在没有getId()和getVersion()方法的情况下使用RequestFactory吗?

时间:2011-09-07 20:18:27

标签: gwt requestfactory

我们正在尝试将RequestFactory与现有Java实体模型一起使用。我们的Java实体都实现了DomainObject接口并公开getObjectId()方法(此名称被选为getId()可能不明确且与域对象的实际 ID冲突来自正在建模的域名。

ServiceLayerDecorator接口允许自定义ID和版本属性查找策略。

public class MyServiceLayerDecorator extends ServiceLayerDecorator {
    @Override
    public Object getId(Object object) {
        DomainObject domainObject = (DomainObject) object;
        return domainObject.getObjectId();
    }
}

到目前为止,这么好。但是,尝试部署此解决方案会产生运行时错误。特别是,RequestFactoryInterfaceValidator抱怨:

[ERROR] There is no getId() method in type com.mycompany.server.MyEntity

然后是:

[ERROR] Type type com.mycompany.client.MyEntityProxy was previously marked as bad
[ERROR] The type com.mycompany.client.MyEntityProxy did not pass RequestFactory validation
[ERROR] Unexpected error
com.google.web.bindery.requestfactory.server.UnexpectedException: The type com.mycompany.client.MyEntityProxy did not pass RequestFactory validation
    at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.die(ServiceLayerDecorator.java:212) ~[gwt-servlet.jar:na]

我的问题是 - 如果ServiceLayerDecorator正在对RequestFactoryInterfaceValidatorgetId()的惯例进行硬编码,为什么getVersion()允许自定义ID和版本查找策略?

我想我可以覆盖ServiceLayerDecorator.resolveClass()来忽略“中毒”代理类,但在这一点上,我似乎对框架的攻击太多......

1 个答案:

答案 0 :(得分:3)

一些选项,其中一些已被提及:

  • Locator。我喜欢为整个项目创建一个Locator,或者至少为具有相似键类型的相关对象组创建。 getId()调用将能够调用您的DomainObject.getObjectId()方法并返回该值。请注意,getDomainType()方法当前未使用,可以返回null或抛出异常。
  • ValueProxy。不要将对象映射到RF可以理解为实体的东西,而是将它们映射到普通值对象 - 不需要id或版本。 RF错过了它可以做的许多聪明的事情,特别是在避免向服务器发送冗余数据方面。
  • ServiceLayerDecorator。这在2.4之前工作,但是随着现在进行的注释处理,它工作得不太好,因为它试图为你做一些工作。似乎ServiceLayerDecorator在过去几个月中已经失去了很多东西 - 理论上,你可以用它来重建getter直接与你的持久性机制交谈,但是现在注释处理验证了你的代码,这已不再是一个选项

所有这一切的大问题是RequestFactory旨在解决单个问题并解决它:允许开发人员使用映射到某些持久性机制的POJO,并从客户端引用这些对象,遵循某些约定以避免编写额外的代码或配置。

因此,它很好地解决了自己的问题,并最终不适合许多其他问题/用例。您可能会发现它不值得:如果是这样,您可能会考虑一些想法:

  • RPC。它并不是很完美,但它确实做了很多工作。
  • AutoBeans(RF基于)仍然是一种非常快速,轻量级的方式,可以通过线路发送数据并将其导入应用程序。您可以像RF一样构建自己的包装器,并将其尝试解决的问题简化为您的用例。