我们正在尝试将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
正在对RequestFactoryInterfaceValidator
和getId()
的惯例进行硬编码,为什么getVersion()
允许自定义ID和版本查找策略?
我想我可以覆盖ServiceLayerDecorator.resolveClass()
来忽略“中毒”代理类,但在这一点上,我似乎对框架的攻击太多......
答案 0 :(得分:3)
一些选项,其中一些已被提及:
Locator
。我喜欢为整个项目创建一个Locator,或者至少为具有相似键类型的相关对象组创建。 getId()调用将能够调用您的DomainObject.getObjectId()方法并返回该值。请注意,getDomainType()
方法当前未使用,可以返回null或抛出异常。ValueProxy
。不要将对象映射到RF可以理解为实体的东西,而是将它们映射到普通值对象 - 不需要id或版本。 RF错过了它可以做的许多聪明的事情,特别是在避免向服务器发送冗余数据方面。ServiceLayerDecorator
。这在2.4之前工作,但是随着现在进行的注释处理,它工作得不太好,因为它试图为你做一些工作。似乎ServiceLayerDecorator在过去几个月中已经失去了很多东西 - 理论上,你可以用它来重建getter直接与你的持久性机制交谈,但是现在注释处理验证了你的代码,这已不再是一个选项所有这一切的大问题是RequestFactory旨在解决单个问题并解决它:允许开发人员使用映射到某些持久性机制的POJO,并从客户端引用这些对象,遵循某些约定以避免编写额外的代码或配置。
因此,它很好地解决了自己的问题,并最终不适合许多其他问题/用例。您可能会发现它不值得:如果是这样,您可能会考虑一些想法: