1

RPC 呼び出しと GWT に問題があります。基本的にPerson、クライアント側の Web コードで作成され、RPC 呼び出しを介してサーバー コードに送信され、DB (OrientDB) に保存されるクラス (クライアントとサーバー間の共通コード) があります。以下の動作を確認しました。

  1. RPC 呼び出し - サーバーに情報を送信し、サーバーから情報を取得できます
  2. DB に保存 - Person オブジェクトが DB に保存されていることを確認済み

私が問題を抱えているのは、クライアントからサーバーへの POJO の転送です。POJO のプロパティがサーバーに送信される直前に完全であることを確認しましたが、サーバーに渡されたオブジェクトにはすべてのプロパティに null 値が含まれています。基本的に、クラスは転送されますが、情報は転送されません。その後、DB に保存されますが、関連する情報が含まれていないことは明らかです。

関連すると思われるものを以下にコピーします。この問題を特定しやすくするために他に提供できることを教えてください。これらはまだテスト状態にあることに注意してください。コメントに注意してください:)

私のPOJOの情報が翻訳で失われる理由は何ですか?

Personオブジェクトの後に、継承元の抽象クラスが続きます。

public class Person extends org.matesweb.shared.AbsPerson implements Serializable
{
    @Id 
    private String id; // DON'T CREATE GETTER/SETTER FOR IT TO PREVENT THE CHANGING BY THE USER APPLICATION, 
                       // UNLESS IT'S NEEDED

    //sets new user details
    public void setPerson(String fIrstName, String mIdInit, String lAstName, String email, String password)
    {
        firstName = fIrstName;
        middleInitial = mIdInit;
        lastName = lAstName;
    }

    /*getter and setter methods - required for every 
     * field due to restrictions imposed by OrientDB*/ 

    public Object getId()
    {
        String tmp;
        tmp = id.toString();
        return tmp;
    }
//end class  
}

public class AbsPerson implements Serializable
{
    String firstName;
    String middleInitial;
    String lastName;

  //  public sys.Login login;

    public org.matesweb.shared.Group[] groups;
    private org.matesweb.shared.Purchase[] purchases;


    /*this method adds a new purchase to the purchases variable*/
/*    public void addPurchase(float price, String description)
    {
        people.Purchase newPurchase = new people.Purchase(login, price, description);
    }
*/    
    /*adds a person to a group by comparing the passed in group ID and PWD*/
    public void addGroup(String groupID, String groupPWD)
    {
        //compare group ID with group PWD to add a user to the group
    }

    /*getter and setter methods - required for every 
     * field due to restrictions imposed by OrientDB*/
    public String getFirstName()
        {
            return firstName;
        }
    public void setFirstName(String name)
        {
            firstName = name;
        }       

    public String getMiddleInitial()
        {
            return middleInitial;
        }
    public void setMiddleInitial(String midInit)
        {
            middleInitial = midInit;
        }       

    public String getLastName()
        {
            return lastName;
        }
    public void setLastName(String ln)
        {
            lastName = ln;
        }       

    /*
    public sys.Login getLogin()
        {
            return login;
        }
    public void setLogin(sys.Login log)
        {
            login = log;
        }
    */

    public org.matesweb.shared.Group[] getGroups()
        {
            return groups;
        }
    public void setGroups(org.matesweb.shared.Group[] gro)
        {
            groups = gro;
        }       

    public org.matesweb.shared.Purchase[] getPurchases()
        {
            return purchases;
        }
    public void setPurchases(org.matesweb.shared.Purchase[] purch)
        {
            purchases = purch;
        }
}

サービス

package org.matesweb.client;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import org.matesweb.shared.Person;

@RemoteServiceRelativePath("peopleService")
public interface PeopleService extends RemoteService {

//test services
    String stringTest(String outgoingString);
    Person getPerson(String persId);

//production services
    String savePerson(Person p);
}

ServiceAsync

import com.google.gwt.user.client.rpc.AsyncCallback;
import org.matesweb.shared.Person;

public interface PeopleServiceAsync
{
    //tests
    void stringTest(String outgoingString, AsyncCallback<String> incomingString);
    void getPerson(String persId, AsyncCallback<Person> retPerson);

    //production services
    void savePerson(Person p , AsyncCallback<String> st);
}

ServiceImplこの特定のメソッドを呼び出します。

//production calls
    @Override
    public String savePerson(Person p) {
        String st = ioObj.saveObj(p);
        if(st.equals("Success")){
            return "Your information has been saved successfully!";
        } else{
            return "Something has gone wrong on our end... Sorry! Error:<br /> " + st;
        } 
    }

最後に、呼び出し自体

private static void savePerson(Person p)
    {        
        // Initialize the service proxy.
        if (peopleSvc == null) {
          peopleSvc = GWT.create(PeopleService.class);
        }

        //resets status
        st="";

        // Set up the callback object.
        AsyncCallback<String> callback = new AsyncCallback<String>() {
            @Override
            public void onFailure(Throwable caught) {
                st = caught.getMessage();
                Label stLabel= new Label(st);
                personTable.setWidget(3,1,stLabel);            
            }

            @Override
            public void onSuccess(String result) {
                st = result;
                HTML stLabel= new HTML(st);
                joinPanel.add(stLabel);
            }
        };
        // Make the call to the people service.
        peopleSvc.savePerson(p, callback);    
    }
4

1 に答える 1

1

GWT の IsSerializable インターフェイスを実装することで、この問題を修正できました。また、Person クラスから Serializable インターフェイスを削除し、継承元の抽象クラスから IsSerializable を継承できるようにしました。

于 2012-12-20T20:39:34.093 に答える