1

さまざまな種類の要素を含むリストに少し問題があります。以前にこの問題に遭遇したことがある人がいるかどうかを確認したいと思います。問題は @ExtraTypes を使用して解決する必要がありますが、うまくいかないので、正しく使用していないと思います。したがって、シナリオは次のとおりです (明確にするために Bean 名が変更されています)。

全般的:

  • RequestFactory で GWT 2.5 を使用しています。

サーバ側:

  • 私は、とりわけ、を含む RootBean を持っています
    リスト <ChildBean>
    .
  • この 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 ({ICildBeanProxy.class, IMoreSpecificChildBeanProxy.class})
    パブリック インターフェイス ICompareRequestContext は RequestContext を拡張します {
       <IRootBeanProxy> の比較を要求します (整数 id1、整数 id2);
    

質問

おそらくこれらの注釈を使用すると、RF はポリモーフィックな継承クラスの存在を認識する必要がありますが、クライアントで取得できるのは IChildBeanProxy 要素のリストを持つ IRootBeanProxy だけです。このリストには MoreSpecificChildBean が含まれていますが、ICildBeanProxy の形になっているため、他のものと区別できません。ExtraTypes アノテーションを間違った場所などに設定している場合、私は何が間違っているのか疑問に思っています。

誰?

すべての助けをありがとう!!

4

1 に答える 1

1

かなりの数のクラスに対してまったく同じことを行いますが、必要に応じて反復してインスタンスのテストを行うことができる基本型が常に返されます。おそらく、オブジェクトをサブクラスにキャストする必要があります。@ExtraTypes を追加しない場合は、サーバー側で MoreSpecificChildBean をクライアントに送信できないというメッセージが表示されるため、わかります。

私はサービスにのみ注釈を付け、プロキシには注釈を付けません。プロキシに @ExtraTypes を追加する 2.4 でいくつかの癖に遭遇しました。

/**
 * 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 に答える