2

私は自分の GWT プロジェクトで RPC を作成していますが、それは実行されていますが、処理したいデータが何らかの形で消えてしまいます。サーバーとしてローカルホストを使用しています。サーバー パッケージには 2 つのクラスがあります。

 package org.elsys.salvation.server;


import org.elsys.salvation.client.Defence;
import org.elsys.salvation.client.FunctionalityManager;

public class Defences {

    private ArrayList<Defence> netDefences;
    private ArrayList<Defence> hardDefences;
    private ArrayList<Defence> softDefences;

    public Defences(FunctionalityManager fm){
        netDefences = fm.getNetDefences();
        hardDefences = fm.getHardDefences();
        softDefences = fm.getSoftDefences();
    }

    public ArrayList<Defence> getNetDefences() {
        return netDefences;
    }

    public ArrayList<Defence> getHardDefences() {
        return hardDefences;
    }

    public ArrayList<Defence> getSoftDefences() {
        return softDefences;
    }
}

および DefenceServiceImpl.java :

package org.elsys.salvation.server;

import java.util.ArrayList;

import org.elsys.salvation.client.DefenceService;
import org.elsys.salvation.client.FunctionalityManager;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class DefenceServiceImpl extends RemoteServiceServlet implements DefenceService {

    private Defences defences;

    @Override
    public void saveDefences(FunctionalityManager fm) {
        defences = new Defences(fm);
    }

    @Override
    public void getHardDefences(FunctionalityManager fm) {
        fm.setHardDefences(defences.getHardDefences());
    }

    @Override
    public void getNetDefences(FunctionalityManager fm) {
        fm.setNetDefences(defences.getNetDefences());
    }

    @Override
    public void getSoftDefences(FunctionalityManager fm) {
        fm.setSoftDefences(defences.getSoftDefences());
    }

}

以下は、DefenceService インターフェースです。

package org.elsys.salvation.client;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("defences")
public interface DefenceService extends RemoteService {

    void saveDefences(FunctionalityManager fm);
    void getHardDefences(FunctionalityManager fm);
    void getNetDefences(FunctionalityManager fm);
    void getSoftDefences(FunctionalityManager fm);
}

およびDefenceServiceAsync:

package org.elsys.salvation.client;

import com.google.gwt.user.client.rpc.AsyncCallback;

public interface DefenceServiceAsync {

    void saveDefences(FunctionalityManager fm, AsyncCallback<Void> callback);

    void getHardDefences(FunctionalityManager fm, AsyncCallback<Void> callback);

    void getNetDefences(FunctionalityManager fm, AsyncCallback<Void> callback);

    void getSoftDefences(FunctionalityManager fm, AsyncCallback<Void> callback);

}

saveDefences メソッドを呼び出すコードは次のとおりです。

private void addDiploma() {

        final AsyncCallback<Void> callback = new AsyncCallback<Void>() {
            public void onFailure(Throwable caught) {

            }

            @Override
            public void onSuccess(Void result) {
                SC.say("Submited");
            }
        };

        some code...

        Button submitButton = new Button("Submit");
        submitButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                FM.getDiploma(projectNameTextBox, diplomantsNameTextBox,
                        diplomaLeadersListBox, reviewersListBox,
                        specialtiesComboBox, typeComboBox);
                FM.generateDefences();
                defenceSvc.saveDefences(FM,callback);
                RootPanel.get("mainDiv").clear();
                showDefences();
            }
        });

        some more code...
    }

FM と defenceSvc の定義は次のとおりです。

public FunctionalityManager FM = new FunctionalityManager();
private DefenceServiceAsync defenceSvc = GWT.create(DefenceService.class);

保存したデータをクライアント側に戻したい場所は次のとおりです。

protected void showDefence() {  
        FunctionalityManager funcM = new FunctionalityManager();
        final AsyncCallback<Void> callback = new AsyncCallback<Void>() {
            public void onFailure(Throwable caught) {

            }

            @Override
            public void onSuccess(Void result) {
                // TODO Auto-generated method stub  
            }
        };
        defenceSvc.getHardDefences(funcM, callback);  
        defenceSvc.getNetDefences(funcM, callback);  
        defenceSvc.getSoftDefences(funcM, callback);  
        final ListGrid DiplomaGrid = new ListGrid();  
        DiplomaGrid.setWidth(500);  
        DiplomaGrid.setHeight(224);  
        DiplomaGrid.setShowAllRecords(true);  
        DiplomaGrid.setCanEdit(true);  
        DiplomaGrid.setEditEvent(ListGridEditEvent.CLICK);  
        DiplomaGrid.setModalEditing(true);  

        DiplomaData dd= new DiplomaData(funcM);

        ListGridField nameField = new ListGridField("name", "Project Name");  
        ListGridField diplomantsField = new ListGridField("diplomants", "Diplomants");  
        ListGridField leaderField = new ListGridField("leader", "Leader");   
        ListGridField reviewerField = new ListGridField("reviewer", "Reviewer");  
        ListGridField typeField = new ListGridField("type", "Type"); 
        ListGridField dateField = new ListGridField("date", "Date");
        DiplomaGrid.setFields(new ListGridField[] {nameField, diplomantsField, leaderField,reviewerField, typeField, dateField});  
        DiplomaGrid.setData(dd.getRecords());

        RootPanel.get("mainDiv").add(DiplomaGrid);
    }  

web.xml:

<servlet>
    <servlet-name>defenceServiceImpl</servlet-name>
    <servlet-class>org.elsys.salvation.server.DefenceServiceImpl</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>defenceServiceImpl</servlet-name>
    <url-pattern>/salvation/defences</url-pattern>
  </servlet-mapping>

開発モードで実行すると実行されますが、showDefence() メソッドを呼び出すと、サーバー データでシリアル化されたデータを取得できません。誰かが問題がどこにあるのか教えてもらえますか?

4

2 に答える 2

4

サーバー側では、FM を変更していますが、それをクライアントに送り返さないでください。それは機能しません。クライアントとサーバー間のオブジェクトの受け渡しはコピー (シリアライズ→デシリアライズ) によって行われるため、サーバーで変更を加えてもサーバー側のコピーにのみ影響します。オブジェクトをサーバーに送信して更新することはできません。そのコピーを送信すると、サーバーは変更が適用された別のコピーを送り返す必要があります。

言い換えれば、あなたのコードでは、メソッドの戻り値の型をvoidから FM に変更し、サーバーに引数を渡された FM を返させ、クライアント側のメソッドで、シングルトンオブジェクトを結果 (コールバック内) でonSuccess更新します。from 、サーバーから返された FM から FM を設定し、他の防御について同様です)。setHardDefenceshardDefenceshardDefences

于 2012-05-21T11:14:04.103 に答える