2011-08-21 42 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 –