0

私は次の親クラスを持っています:

public class ListUIModel<T extends BaseModel> extends BaseModel implements List<T> {

    protected ArrayList<T> list = new ArrayList<T>();

    public ListUIModel() {
    }

    public ListUIModel(T... models) {
        list = ArraysUtil.asList(models);
    }

    //implementation of List interface...

ListUIModel からクラスを派生させます。

public class ProducersUIModel extends ListUIModel<ProducerUIModel> {

public ProducersUIModel() {
}

public ProducersUIModel(ProducerUIModel... producers) { 
    super(producers);
}

other methods...

Service メソッドは PublicationUIModel を返します。

このコードは gwt によってコンパイルされ、Tomcat を実行すると、次の警告が表示されます。

29 Nov 2012 09:10:59,498: ERROR http-8443-Processor21 org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/] - userProfileController: ERROR: Could not find class 'org.gwtwidgets.client.temp.TMouseListenerCollection' listed in the serialization policy file '/5C1ACC115899B7BFEC8646E55EC693E0.gwt.rpc'; your server's classpath may be misconfigured
java.lang.ClassNotFoundException: org.gwtwidgets.client.temp.TMouseListenerCollection
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1377)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1223)
    at java.lang.Class.forName0(Native Method)...

そして、GWT の util CompileReport は次のように述べています。

org.gwtwidgets.client.temp.TMouseListenerCollection
   Serialization status
      Instantiable
   Path
      'org.gwtwidgets.client.temp.TMouseListenerCollection' is reachable as a subtype of type 'class java.util.ArrayList<T>'
      'java.util.ArrayList<T>' is reachable from field 'list' of type 'com.xalmiento.desknet.ui.client.model.ListUIModel<T>'
      'com.xalmiento.desknet.ui.client.model.ListUIModel<com.xalmiento.desknet.ui.client.model.ProducerUIModel>' is reachable as a supertype of type 'class com.xalmiento.desknet.ui.client.model.ProducersUIModel'
      'com.xalmiento.desknet.ui.client.model.ProducersUIModel' is reachable as a subtype of type 'class com.xalmiento.desknet.ui.client.model.ProducersUIModel'

GWT が TMouseListenerCollection をロードしようとするのはなぜですか? 私はArrayList(他の場所ではなし)を使用していますが、大丈夫です。私には理解するのが難しいです:(

このクラスを .gwt.rpc ポリシー ファイルから明示的に除外できることはわかっています。しかし、別のアプローチでこの問題を解決するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

GWT コンパイラは、IsSerializable を実装している ArrayList からすべてのサブタイプをリストしようとします。解決策は、IsSerializable インターフェイスを TMouseListenerCollection から削除するか、rpc 経由で送信しない場合は ListUIModel でリストを一時的 ( non-serializable ) として宣言することです。

于 2012-12-03T08:36:50.360 に答える