【问题标题】:GWT SerializationException__Ljava_lang_String_2V while doing RPC进行 RPC 时的 GWT SerializationException__Ljava_lang_String_2V
【发布时间】:2011-08-21 17:41:33
【问题描述】:

下面是我的 service、serviceImpl 和 async 回调接口。感谢有人可以帮助我理解为什么没有调用 submitTeam(...)(我看到 isValidEmail(...) 在使用时被调用)。至少为我提供调试方法,因为目前我无法使用 eclipse 调试器(eclipse 没有在断点处停止)并且 sysout/syserr 语句也没有被记录到控制台:-(。

@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 funpluscharity@gmail.com";
        }
    }
}

以下方法将调用 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());
            }
        }

在基于@Pistol 建议添加 Window.alert(...) 后取得了一些进展,它将进入 SubmitTeamCallback 类的 onFailure(Throwable t) 方法.

unknown.com_google_gwt_user_client_rpc_SerializationException_SerializationException__Ljava_lang_String_2V(未知来源)

【问题讨论】:

    标签: java gwt


    【解决方案1】:

    调试客户端代码的另一种方法是使用Window.alert(...)。例如,将它放在你的回调 onFailure() 方法中,以查看捕获的消息作为开始。或者您可以使用FireBug 或类似的东西来查看是否真的进行了 rpc 调用?

    编辑:

    你确定你的 Player 类实现了IsSerializable 并且有一个空的构造函数吗?查看Serializable User-Defined Classes

    【讨论】:

    • +1 我使用了 FirBug 的 XHR 控制台,发现没有提交任何内容。我将使用 Window.alert() 并查看
    • 我有 Player 类和 Captain 类(从 Player 扩展而来),它们都实现了 Serializable 和 IsSerializable 接口。和 List 玩家可以包含 Player 或 Captain 对象。
    【解决方案2】:

    想通了。 POJO 应该有一个默认构造函数,而我使用的那个没有。 GWT 编译器也没有抱怨。不知道为什么。

    【讨论】:

    • 听起来和我的回答一模一样 :)
    • @pistolPanties 是的,我没有注意您帖子中的空构造函数。我接受了你的帖子作为答案。交易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2014-12-06
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多