2011-08-21 78 views
0

下面是我的service,serviceImpl和異步回調接口。感謝有人可以幫助我理解爲什麼submitTeam(...)不被稱爲(我多麼希望看到isValidEmail(...)在使用時被調用)。至少給我提供了調試這個方法,因爲現在我無法使用Eclipse調試器(日食是不是在斷點處停止)和系統輸出/ SYSERR語句沒有被記錄到控制檯或者:-(。GWT SerializationException__Ljava_lang_String_2V做RPC時

@RemoteServiceRelativePath("registrationService") 
public interface RegistrationService extends RemoteService 
{ 
    Boolean isValidEmail(String email); 

    String submitTeam(String teamName, List<Player> players); 
} 

public interface RegistrationServiceAsync 
{ 
    void isValidEmail(String email, AsyncCallback<Boolean> callback); 

    void submitTeam(String teamName, List<Player> players, AsyncCallback<String> callback); 
} 

public class SubmitTeamCallback implements AsyncCallback<String> { 
    private final Label status; 

    public SubmitTeamCallback(Label s) { 
     status = s; 
    } 

    public void onFailure(Throwable caught) { 
     status.setText(caught.getMessage()); 
    } 

    public void onSuccess(String result) { 
     System.out.println("" + getClass().getName() + " : " + result); 
     status.setText(result); 
    } 
} 


public class RegistrationCallback implements AsyncCallback<Boolean> 
{ 
    private final Label   status; 
    private final PlayerWidget playerWidget; 
    private Boolean    isValidSharedFlag; 

    public RegistrationCallback(Label s, PlayerWidget pw, Boolean isValid) 
    { 
     status = s; 
     playerWidget = pw; 
     setIsValidSharedFlag(isValid); 
    } 

    public void onFailure(Throwable caught) 
    { 
     status.setText(caught.getMessage()); 
    } 

    public void onSuccess(Boolean result) 
    { 
     if (result.equals(Boolean.FALSE)) 
     { 
      playerWidget.invalidEmail(); 
      String oldText = status.getText(); 

      status.setText(oldText + "Please specify a valid email address for the captain."); 
      setIsValidSharedFlag(Boolean.FALSE); 
     } else 
     { 
      playerWidget.validEmail(); 
      String newText = status.getText().replace("Please specify a valid email address for the captain.", ""); 
      status.setText(newText); 
      setIsValidSharedFlag(Boolean.TRUE); 
     } 
    } 

    public void setIsValidSharedFlag(Boolean isValidSharedFlag) 
    { 
     this.isValidSharedFlag = isValidSharedFlag; 
    } 

    public Boolean getIsValidSharedFlag() 
    { 
     return isValidSharedFlag; 
    } 
} 

public class RegistrationServiceImpl extends RemoteServiceServlet implements 
     RegistrationService { 
    Logger logger = Logger.getLogger(""); 
    private final Emailer emailer = new Emailer(); 
    private final EmailValidator validator = new EmailValidator(); 

    public Boolean isValidEmail(String email) { 
     return validator.validate(email); 
    } 

    public String submitTeam(String teamName, List<Player> players) { 
     logger.log(Level.SEVERE, "This is a test log"); 

     System.out.println("This is a test log"); 
     boolean emailSent = false; 
     for (Player p : players) { 
      System.out.println("Emailing to captain"); 
      if (p instanceof Captain) { 
       if (!validator.validate(p.getEmail())) { 
        return "Please specify a valid email"; 
       } 
       System.out.println("Emailing to captain"); 
       emailSent = emailer.email(p); 
      } 
     } 
     if (emailSent) { 
      System.out.println("Email sent successfully"); 
      return teamName 
        + " has been successfully registered. Please pay the registration fee to confirm registration. Thank you."; 
     } else { 
      return "Unable to send email. Please email the team details [Team name, minimum of 6 players, captain's email address and phone number] to [email protected]"; 
     } 
    } 
} 

下面的方法是要調用RPC調用

private void registerTeam() { 
      System.out.println("Received request to dubmit team"); 
      StringBuilder statusText = new StringBuilder(); 
      try { 
       Boolean isValid = true; 

       RegistrationServiceAsync service = (RegistrationServiceAsync) GWT 
         .create(RegistrationService.class); 
       ServiceDefTarget serviceDef = (ServiceDefTarget) service; 
       System.err.println(".........." + GWT.getModuleBaseURL()); 
       serviceDef 
         .setServiceEntryPoint("/services/registrationService"); 

       if (teamName.getText() == null 
         || teamName.getText().length() == 0) { 
        isValid = false; 
        statusText.append("Please specify team name. "); 
       } 
       Player captain = getCaptain(); 
       if (!atleast6PlayersAreSpecified()) { 
        isValid = false; 
        statusText.append("Please specify atleast 6 players. "); 
       } 
       if (captain == null) { 
        isValid = false; 
        statusText.append("Please designate a captain. "); 
       } 
       System.out.println("Is request valid? " + isValid); 
       if (isValid.equals(Boolean.TRUE)) { 
        System.out.println("RPC - submitTeam start "); 
        System.out.println("" + getPlayers()); 
        SubmitTeamCallback callback = new SubmitTeamCallback(status); 
        service.submitTeam(teamName.getText(), getPlayers(), 
          callback); 
        System.out.println("RPC - submitTeam end"); 

       } else { 
        status.setText(statusText.toString()); 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
       System.err.println(e.getMessage()); 
      } 
     } 

制(...)基於Window.alert上@Pistol建議,它要onFailure處(的Throwable t)的方法後加入了一些進展SubmitTea mCallback類。

unknown.com_google_gwt_user_client_rpc_SerializationException_SerializationException__Ljava_lang_String_2V(未知來源)

回答

1

調試客戶端代碼的另一種方法是使用Window.alert(...)。例如,將它放在回調onFailure()方法中,以查看捕獲的消息以獲取開始。或者您可以使用FireBug或類似的東西來查看rpc-call是否真的在製作?

編輯:

你確定你的播放器類實現IsSerializable,並有一個空的構造?退房Serializable User-Defined Classes

+0

+1我使用FirBug的XHR控制檯,看到沒有提交任何內容。我將使用Window.alert()並參見 –

+0

我有Player類和Captain類(從Player擴展而來),都實現了Serializable和IsSerializable接口。和列表玩家可以包含玩家或隊長對象。 –

0

想通了。 POJO應該有一個默認構造函數,而我正在使用的構造函數沒有。 GWT編譯器也沒有抱怨。不知道爲什麼。

+0

這聽起來完全像我的回答:) – pistolPanties

+0

@pistolPanties是的我沒有注意到從您的文章中的空構造函數。我接受你的文章作爲答案。 TX –