我正在使用GWT RequestFactory工具,我希望在客户端和服务器之间共享一些代码。 为了实现我的目标,我在客户端代理和服务器域类之间实现了一个通用接口。 所以我有类似的东西:
常用接口
public interface IPerson {
IColor getColor();
}
public interface IColor {
String getColor();
}
域类
public class Person implements IPerson {
private Color color;
public Color getColor() {
return color;
}
}
public class Color implements IColor {
private String color;
public String getColor() {
return color;
}
}
代理接口
@ProxyFor(Person.class)
public interface PersonProxy extends EntityProxy, IPerson {
ColorProxy getColor();
}
@ProxyFor(Color.class)
public interface ColorProxy extends EntityProxy, IColor {
String getColor();
}
这仅在我将这些代理用作RequestContext的返回参数类型时有效, 但是当我尝试将代理作为参数类型传递时,例如:
Request<Void> persist(PersonProxy personProxy);
我收到了UnsupportedOperationException:
java.lang.UnsupportedOperationException: com.example.IColor
at com.google.web.bindery.autobean.shared.ValueCodex.getTypeOrDie(ValueCodex.java:375)
at com.google.web.bindery.autobean.shared.ValueCodex.decode(ValueCodex.java:299)
at com.google.web.bindery.requestfactory.shared.impl.EntityCodex.decode(EntityCodex.java:107)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor$1.visitReferenceProperty(SimpleRequestProcessor.java:545)
at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:324)
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166)
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:101)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processOperationMessages(SimpleRequestProcessor.java:524)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:218)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:135)
at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133)
问题是GWT不会“覆盖”getter,不仅仅考虑PersonProxy
ColorProxy getColor();
也是他的超级对手
IColor getColor();
抛出exeption,因为他找不到IColor的域类型。
问题是在com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.calculateData(Class beanType)中使用beanType.getMethods()填充getter,我看不到任何修改此行为的方法。
有没有办法让gwt只使用最具体的吸气剂?
谢谢!
答案 0 :(得分:0)
我认为任何继承的接口都需要从EntityProxy或ValueProxy扩展。这几乎肯定是你遇到的问题。您是否正在运行requestfactory验证程序。在您被允许运行代码之前,似乎会抛出错误?
答案 1 :(得分:0)
在客户端和服务器之间共享代码的理由是什么? Request Factory的前提是将客户端与服务器分开。在客户端上,您使用轻量级接口来复制服务器端结构,从而允许您将两个问题分开。
在服务器上,您可以拥有所有重量级注释,依赖关系以及客户端。
要记住的另一件事是请求工厂以不同方式处理客户端dto(接口)并管理遍历。也就是说,如果您已经要求RF加载参考,那么您只能遍历客户端上的树。因此,尊重客户端上的界面会有问题。