【问题标题】:GWT RequestFactory, how to override getters in EntityProxy?GWT RequestFactory,如何覆盖 EntityProxy 中的 getter?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 验证器没有抱怨,实际上问题是由于我的接口没有扩展 EntityProxy 或 ValueProxy。我最终使用了从代理到接口的包装器。
    • @Gainder,你能描述一下你是如何解决这个问题的吗?看来我们在这里遇到了同样的问题:stackoverflow.com/q/36714312/187241.
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 2013-07-01
      相关资源
      最近更新 更多