1

非同期呼び出しを使用して、サーバーからクライアントに ArrayList を送信したいと考えています。呼び出しは成功しますが、処理中に ArrayList エントリが複製されます。私は完全に迷っています。コードは非常に単純です。このエラーがいつどこで発生するかわかりません。

共有クラス:

package com.posteurs.cine.shared;

import java.io.Serializable;
import java.util.ArrayList;

public class Codes extends ArrayList<Integer> implements Serializable{
private static final long serialVersionUID = 1L;
//insert 2 values
public Codes(){
    this.add(10);
    this.add(20);
}
}

インターフェイス:

package com.posteurs.cine.client;

import java.util.Set;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.posteurs.cine.shared.Codes;

@RemoteServiceRelativePath("cineSvc")
public interface CineSvc extends RemoteService {
    public Codes getCodes();
}



package com.posteurs.cine.client;

import java.util.Set;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.posteurs.cine.shared.Codes;

public interface CineSvcAsync {
    public void getCodes(AsyncCallback<Codes> callback);
}

実装:

package com.posteurs.cine.server;

import java.util.Iterator;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.posteurs.cine.client.CineSvc;
import com.posteurs.cine.shared.Codes;

public class CineSvcImpl extends RemoteServiceServlet implements CineSvc {
    private static final long serialVersionUID = 1L;

    public CineSvcImpl(){
    }

    public Codes getCodes(){
        Codes c = new Codes();
        System.out.println("On server -----------------");
        System.out.println("impl.getCodes: Codes size="+c.size());
        return c;
    }
}   

呼び出し:

package com.posteurs.cine.client;

import java.util.Iterator;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.posteurs.cine.client.CineSvcAsync;
import com.posteurs.cine.shared.Codes;

public class Cine implements EntryPoint {
@Override
public void onModuleLoad() {
    CineSvcAsync svc = GWT.create(CineSvc.class);
    svc.getCodes( new AsyncCallback<Codes>() {
        public void onFailure(Throwable caught) {
            System.out.println("getCodes::callback: Async failed");
        }

        public void onSuccess(Codes result) {
            System.out.println("On client -----------------");
            System.out.println("Callback result size="+result.size());
            Iterator<Integer> it = result.iterator();
            while (it.hasNext()) 
                System.out.println(it.next());
        }
        });
}       

トレース結果:

    On server -----------------
    impl.getCodes: Codes size=2
    On client -----------------
    Callback result size=4
    10
    20
    10
    20
4

1 に答える 1

1

重複する値は、デフォルトのコンストラクターでの初期化が原因であると強く疑っています。デフォルトのコンストラクターは、オブジェクトの「アンマーシャリング」中のシリアル化で特別な役割を果たします。シリアル化されたフィールド値をコピーして戻す前に、「空の」オブジェクトを再作成するために呼び出されます。

別の場所でコードを初期化してみてください。たとえば、Codesクラスにinit()メソッドを設定し、インスタンスを作成した後、CineSvcImpl.getCodes()でこのメソッドを明示的に呼び出すことができます。

于 2012-09-15T13:43:45.887 に答える