Nano Hash - криптовалюты, майнинг, программирование

GWT SerializationException__Ljava_lang_String_2V при выполнении RPC

Ниже приведены мои интерфейсы обратного вызова 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 [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) класса SubmitTeamCallback.

unknown.com_google_gwt_user_client_rpc_SerializationException_SerializationException__Ljava_lang_String_2V (Неизвестный источник)

21.08.2011

Ответы:


1

Альтернативный метод отладки кода на стороне клиента - использование Window.alert (...). Например, поместив его в метод обратного вызова onFailure (), чтобы для начала просмотреть перехваченные сообщения. Или вы можете использовать FireBug или что-то подобное, чтобы узнать, действительно ли выполняется вызов rpc?

Изменить:

Вы уверены, что ваш класс Player реализует IsSerializable и у вас есть пустой конструктор? Ознакомьтесь с сериализуемыми пользовательскими классами .

21.08.2011
  • +1 Я использовал консоль XHR от FirBug и вижу, что ничего не отправляется. Я воспользуюсь Window.alert () и посмотрю 21.08.2011
  • У меня есть класс Player и класс Captain (наследующий от Player), реализующие интерфейсы Serializable и IsSerializable. и Список Игроки ‹Player› могут содержать объекты Player или Captain. 21.08.2011

  • 2

    Разобрался в этом. У POJO должен быть конструктор по умолчанию, а у того, который я использую, его не было. Компилятор GWT тоже не жаловался. Не знаю почему.

    21.08.2011
  • это звучит в точности как мой ответ :) 22.08.2011
  • @pistolPanties ага, я не обратил внимания на пустой конструктор из вашего поста. я принял ваш пост как ответ. tx 22.08.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..