Я рекомендую Переместить AbstractMessage в пакет моделей - так как это суперкласс модели QueryResponse .
А также наследование в моделях является хорошей идеей, если у вас есть 0 полей и только методы (поведение) в суперклассе.
Наконец, если GWT хочет сделать ваш QueryResponse в javascript - ему нужны ВСЕ типы, указанные в исходном файле, для правильной компиляции. Поэтому не упоминайте никакие серверные классы в исходном файле, который должен стать javascript.
Иметь регион, в котором есть все классы java на стороне сервера, которые будут запускаться в JVM на сервере, и другой регион, полный исходных файлов, которые будут компилироваться в javascript компилятором GWT. Код / классы регионов на стороне сервера МОГУТ ссылаться на код / классы регионов клиента, но ОБЯЗАТЕЛЬНО НЕ наоборот . Убедитесь, что ни один код, который станет javascript, не ссылается (даже неиспользуемый оператор import) на класс на стороне сервера.
Компилятор GWT работает только с исходными файлами, однако вам необходимо скомпилировать код клиента в файлы .class, чтобы ваши серверные классы могли ссылаться на них.
НОВОЕ РЕДАКТИРОВАНИЕ:
Я провел небольшое исследование по этому вопросу, вы правы, GWT будет искать все реализации абстрактного класса, если и только если на AbstractClass ссылаются в интерфейсе RPC GWTAsync, даже если некоторые находятся в Пакеты GWT.
Допустим, по сети поступает объект типа AbstractClass, и теперь десериализатору GWT поручено скрыть сетевые данные в конкретном экземпляре. Он должен знать обо всех реализациях AbstractClass, чтобы найти, что происходит по сети прямо сейчас! - Таким образом, для достижения этой цели во время компиляции генерируется файл .rpc для каждого интерфейса службы GWT, в котором перечислены все возможные конкретные типы, которые могут возвращать методы службы.
Рэй Райан (сотрудник Google) однажды упомянул, что плохая идея - использовать аргументы интерфейсов или возвращаемые типы в любом интерфейсе RPC. - потому что десериализатору трудно узнать точный тип.
Вы можете вручную отредактировать сгенерированный RPC-файл и удалить ошибочные типы или пометить другие реализации как не сериализуемые, не реализовав Serializable в этих реализациях в других пакетах.
Лучше может быть ...
Я подозреваю, что вы написали код: «реализует java.io.Serializable» на верхнем уровне (для самого AbstractClass), возможно, сейчас пришло время перенести его в каждую реализацию.
Теперь задача десериализатора GWT RPC ясна и понятна - он знает, что только определенные реализации (которые можно сериализировать) в AbstractClass будут проходить по сети и достигать и компилировать только их. Поэтому он не будет компилировать другие не сериализуемые подклассы вашего AbstractClass - поскольку он знает, что они не сериализуемы.