Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с сериализацией в GWT RPC / 7 сообщений из 7, страница 1 из 1
14.05.2012, 14:15:56
    #37793223
Cyril A. Karpenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с сериализацией в GWT RPC
Привет!

Совсем недавно столкнулся с достаточно странной ситуацией. Суть проблемы заключается в том,
что 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
14.05.2012, 14:25:10
    #37793244
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с сериализацией в GWT RPC
Cyril A. Karpenko,

Вы бы лучше, чем писать столько букв, сам класс, который не сериализуется показали, и исключение.
...
Рейтинг: 0 / 0
14.05.2012, 14:51:57
    #37793295
Cyril A. Karpenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с сериализацией в GWT RPC
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
14.05.2012, 14:52:28
    #37793300
Cyril A. Karpenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с сериализацией в GWT RPC
Cyril A. Karpenko, Забыл добавить форматирование. Простите.
...
Рейтинг: 0 / 0
14.05.2012, 15:10:12
    #37793342
marx_freedom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с сериализацией в GWT RPC
Cyril A. Karpenko,

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

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



Пальцем в небо конечно, но я сталкивался с ситуацией когда именно это помогало (т.к. gwt создает js на основе исходников, а не бинарных class файлов).
...
Рейтинг: 0 / 0
14.05.2012, 16:20:45
    #37793500
Cyril A. Karpenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с сериализацией в GWT RPC
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
12.07.2012, 21:17:38
    #37877337
Cyril A. Karpenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы с сериализацией в GWT RPC
Решил проблему путём использования адаптеров. Проблем, в случае с данным подходом - куча. Но проблема решается.

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


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