【发布时间】:2014-09-15 10:11:25
【问题描述】:
我正在使用 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();
因为找不到 IColor 的域类型而抛出异常。
问题是在com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.calculateData(Class beanType) 中,getter 是使用 beanType.getMethods() 填充的,我看不到任何修改此行为的方法。
有没有办法让 gwt 只使用最具体的 getter?
谢谢!
【问题讨论】:
标签: java gwt requestfactory