GWT RequestFactory,如何覆盖EntityProxy中的getter?

时间:2014-09-15 10:11:26

标签: java gwt requestfactory

我正在使用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只使用最具体的吸气剂?

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为任何继承的接口都需要从EntityProxy或ValueProxy扩展。这几乎肯定是你遇到的问题。您是否正在运行requestfactory验证程序。在您被允许运行代码之前,似乎会抛出错误?

答案 1 :(得分:0)

在客户端和服务器之间共享代码的理由是什么? Request Factory的前提是将客户端与服务器分开。在客户端上,您使用轻量级接口来复制服务器端结构,从而允许您将两个问题分开。

在服务器上,您可以拥有所有重量级注释,依赖关系以及客户端。

要记住的另一件事是请求工厂以不同方式处理客户端dto(接口)并管理遍历。也就是说,如果您已经要求RF加载参考,那么您只能遍历客户端上的树。因此,尊重客户端上的界面会有问题。