1

我对包含不同类型元素的列表有一点问题,我想看看你们中是否有人遇到过这个问题。这个问题应该通过使用@ExtraTypes 来解决,但它对我不起作用,所以我想我没有正确使用它。因此,场景是(为清楚起见更改了 bean 名称):

一般的:

  • 我将 GWT 2.5 与 RequestFactory 一起使用。

服务器端:

  • 我有一个 RootBean,其中包含一个
    列表 <子豆>
    .
  • 这个 ChildBean 包含一些原始属性。
  • ChildBean 也由一个 MoreSpecificChildBean 扩展,它继承了所有父属性并添加了更多属性。
  • 根据某些逻辑,RootBean 的列表中填满了 ChildBean 和 MoreSpecificChildBean 类型的元素。

客户端:

  • IRootBeanProxy 是具有以下注释的 ValueProxy:

    @ProxyFor(值 = RootBean.class)
     @ExtraTypes ({IMoreSpecificChildBeanProxy.class})
    

并包含一个列表

列出 <IChildBeanProxy> getChildren();

  • IChildBeanProxy 是一个 ValueProxy:
    @ProxyFor(值=ChildBean)
    公共接口 IChildBeanProxy 扩展了 ValueProxy
    
  • IMoreSpecificChildBeanProxy 是一个 ValueProxy:
    @ProxyFor(值=MoreSpecificChildBean)
    公共接口 IMoreSpecificChildBeanProxy 扩展 IChildBeanProxy
    
  • Request 上下文有一个返回 Request 的方法,我在这里也添加了 @ExtraTypes 注释:
    @Service(值 = CompareService.class,定位器 = SpringServiceLocator.class)
    @ExtraTypes ({IChildBeanProxy.class, IMoreSpecificChildBeanProxy.class})
    公共接口 ICompareRequestContext 扩展 RequestContext {
       请求 <IRootBeanProxy> 比较(整数 id1,整数 id2);
    

问题

假设有了这些注释,RF 应该知道多态继承类的存在,但我在客户端中得到的只是一个 IRootBeanProxy 和一个 IChildBeanProxy 元素列表。此列表包括 MoreSpecificChildBean,但采用 IChildBeanProxy 的形式,因此我无法将其与其他列表区分开来。所以我想知道我做错了什么,如果我将 ExtraTypes 注释设置在错误的地方或什么地方。

任何人?

感谢所有的帮助!

4

1 回答 1

1

我对很多类都做了完全相同的事情,但它总是会返回我可以迭代并在需要时测试 instanceof 的基本类型。您可能必须将对象强制转换为子类。如果您不添加@ExtraTypes,您将知道,因为在服务器端您将收到一条消息,指出无法将 MoreSpecificChildBean 发送到客户端。

我只注释服务而不是代理,我在 2.4 中遇到了一些怪癖,将 @ExtraTypes 添加到代理。

/**
 * Base proxy that all other metric proxies extend. It is used mainly for it's
 * inheritence with the RequestFactory. It's concrete implementation is
 * {@link MetricNumber}.
 * 
 * @author chinshaw
 */
@ProxyFor(value = Metric.class, locator = IMetricEntityLocator.class)
public interface MetricProxy extends DatastoreObjectProxy {


    /**
     * Name of this object in the ui. This will commonly be extended by
     * subclasses.
     */
    public String NAME = "Generic Metric";

    /**
     * This is a list of types of outputs that the ui can support. This is
     * typically used for listing types of supported Metrics in the operation
     * output screen.
     * 
     * @author chinshaw
     */
    public enum MetricOutputType {
        MetricNumber, MetricString, MetricCollection, MetricStaticChart, MetricDynamicChart
    }

    /**
     * See {@link MetricNumber#setName(String)}
     * 
     * @param name
     */
    public void setName(String name);

    /**
     * See {@link MetricNumber#setContext(String)}
     * 
     * @return name of the metric.
     */
    public String getName();


    /**
     * Get the list of violations attached to this metric.
     * 
     * @return
     */
    public List<ViolationProxy> getViolations();
}

@ProxyFor(value = MetricNumber.class, locator = IMetricEntityLocator.class)
public interface MetricNumberProxy extends MetricProxy {

    public List<NumberRangeProxy> getRanges();

    public void setRanges(List<NumberRangeProxy> ranges);
}

...

@ProxyFor(value = MetricDouble.class, locator = IMetricEntityLocator.class)
public interface MetricDoubleProxy extends MetricNumberProxy {

    /* Properties when fetching the object for with clause */
    public static String[] PROPERTIES = {"ranges"};

    public Double getValue();
}

...

@ProxyFor(value = MetricPlot.class, locator = IMetricEntityLocator.class)
public interface MetricPlotProxy extends MetricProxy {

    /**
     * UI Name of the object.
     */
    public String NAME = "Static Plot";

    public String getPlotUrl();
}

这是一个组合方法,因为我通常总是返回可能包含指标列表的复合类。话虽如此,这将返回我基本类型的指标,然后我可以转换它们。

@ExtraTypes({ MetricProxy.class, MetricNumberProxy.class, MetricDoubleProxy.class, MetricIntegerProxy.class})
@Service(value = AnalyticsOperationDao.class, locator = DaoServiceLocator.class)
public interface AnalyticsOperationRequest extends DaoRequest<AnalyticsOperationProxy> {

    Request<List<<MetricProxy>> getSomeMetrics();

}

这不是我使用的确切方法,但可以用于获取类型代理。

context.getSomeMetrics().with(MetricNumber.PROPERTIES).fire(new Receiver<List<MetricProxy>>() {

  public void onSuccess(List<MetricProxy> metrics) {
      for (MetricProxy metric : metrics) {
          if (metric instanceof MetricDoubleProxy) {
              logger.info("Got a class of double " + metric.getValue());
          }
      }          
  }
}

当您收到上述错误时,您将知道是否缺少 @ExtraTypes 注释。

希望有帮助

于 2013-03-05T20:12:54.697 回答