powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с сериализацией в GWT RPC
7 сообщений из 7, страница 1 из 1
Проблемы с сериализацией в GWT RPC
    #37793223
Cyril A. Karpenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!

Совсем недавно столкнулся с достаточно странной ситуацией. Суть проблемы заключается в том,
что GWT отказывается сериализовать родительский класс моей DTO-сущности, при том, что саму эту
сущность он вполне себе успешно сериализует и добавляет в whitelist RPC.

Из-за этого, очевидно, часть полей сущности выбрасывается, потому что getDeclaredFields() делается только для
неё, а parent-класс по каким-то причинам считается забаненым.

Пытаясь решить проблему, я пришёл к решению со стороны серверного сериализатора, написав кастомную политику
сериализации и всё стало нормально. Но, тут внезапно всплыл другой косяк, а именно разница CRC - поскольку версия сущности
на клиента сгенерирована без полей parent-класса!

И вот сейчас я немного в замешательстве, что делать дальше :-)

Структура проекта следующая:
Framework ->
persistence ->
Peristence.gwt.xml
Project ->
domain ->
Domain.gwt.xml <- Persistence.gwt.xml
web ->
App.gwt.xml <- domain

Сборка осуществляется через Maven GWT.

P.S
1. Использовать AbstractDTO в качестве return value для одного из методов сервиса пробовал.
2. Все зависимости указаны корректно (<compileArtifactSource/>)
3. Все зависимости деплоятся как source-jars и в них точно есть необходимые для компиляции сущности.
4. Сначала думал, что проблема из-за косвенной зависимости web от persistence, но прямое добавление последней в качестве <inherits> - не помогло.
5. Все сущности Serializable
6. Сделать AbstractDTO - IsSerializable - не выход, потому что persistence не должен иметь зависимости от GWT


Помогите мне кто-то! :-)
...
Рейтинг: 0 / 0
Проблемы с сериализацией в GWT RPC
    #37793244
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyril A. Karpenko,

Вы бы лучше, чем писать столько букв, сам класс, который не сериализуется показали, и исключение.
...
Рейтинг: 0 / 0
Проблемы с сериализацией в GWT RPC
    #37793295
Cyril A. Karpenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wessen, Если бы причина могла быть в нём, я бы его сразу же добавил!

Но, если вам это поможет:

Entity -> JPA entity (добавляется как <super-source/>)

/** Модуль persistnce **/

interface IDTO extends Entity, Serializable {

public Long getId();

public void setId( Long id );

}

public abstract class AbstractDTO extends IDTO {

private Long id;


public void setId( Long id ) {
this.id = id;
}

public Long getId() {
return this.id;
}
}

Persistence.gwt.xml
<module>

<source path="persistence"/>

</module>
/** Модуль /persistence **/

/** Модуль domain **/

public interface ICategoryDTO extends IDTO {
public String getName();

public void setName( String name );
}

public class CategoryDAO extends AbstractDTO implements ICategoryDTO {

private String name;

public void setName( String name ) {
this.name = name;
}

public String getName() {
return this.name;
}

}

Domain.gwt.xml
<module>

<inherits name="com.somename.Persistence" />

<source path="persistence"/>

</module>

/** /Модуль domain **/

/** Модуль web **/

@RemoteServiceRelativePath("../rpc/main.do")
public interface ApplicationAccessService extends RemoteService {

public AbstractDTO loadCategories();

}

Web.gwt.xml
<module rename-to="Application">
<inherits name='com.google.gwt.user.User' />
<inherits name="com.google.gwt.rpc.RPC"/>

<inherits name='com.google.gwt.inject.Inject'/>

<inherits name="com.somename.Domain"/>

<!-- Specify the app entry point class. -->
<entry-point class='com.somename.Application' />

<source path="client"/>

<source path='service'/>

<super-source path="client/jre"/>


</module>


/** /Модуль web **/


-----
...
Рейтинг: 0 / 0
Проблемы с сериализацией в GWT RPC
    #37793300
Cyril A. Karpenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyril A. Karpenko, Забыл добавить форматирование. Простите.
...
Рейтинг: 0 / 0
Проблемы с сериализацией в GWT RPC
    #37793342
marx_freedom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyril A. Karpenko,

попробуй для CategoryDAO и для его родителя добавить пустой конструктор по-умолчанию.

Код: java
1.
2.
public CategoryDAO() {
}



Пальцем в небо конечно, но я сталкивался с ситуацией когда именно это помогало (т.к. gwt создает js на основе исходников, а не бинарных class файлов).
...
Рейтинг: 0 / 0
Проблемы с сериализацией в GWT RPC
    #37793500
Cyril A. Karpenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
marx_freedom,

Ну, у CategoryDTO, в действительности, есть конструктор публичный:
Код: java
1.
2.
3.
public CategoryDTO() {
    super( ICategory.class );
}



Вот у AbstractDTO его нету. У него есть только закрытый следующего вида:
Код: java
1.
2.
3.
protected AbstractDTO( Class<? extends IEntity> clazz ) {
    ....
}
...
Рейтинг: 0 / 0
Проблемы с сериализацией в GWT RPC
    #37877337
Cyril A. Karpenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил проблему путём использования адаптеров. Проблем, в случае с данным подходом - куча. Но проблема решается.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
class UserWrapper implements IUser....
     private Long id;
     private IUser user; 
    
     public UserWrapper( IUser user, Long id ) {
         this.user = user;
         this.id = id;
     }

     public IUser getTargetObject() {
         return this.user;
     }

     @Override
     public Long getId() {
         return this.id;
     }

     @Override
     public void setId( Long id ) {
          this.id = id;
     }

     /**
       * Далее идёт делегирование всех прочих методов IUser к объекту this.getTargetObject()
      */
}



Для того, чтобы полноценно использовать данный подход, необходимо проксировать все методы вашего RemoveService (см. InvocationHandler) и возможностями рефлексии обходить всю иерархию свойств возвращаемых ими объектов (конечно, если есть необходимость в применении данной логики к ним) и "оборачивать" их в адаптер подобный приведённому выше.

Самое сложное, с чем столкнулся в процессе - обработка циклических зависимостей.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с сериализацией в GWT RPC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]