отправка объектов в течение весны в GWT - PullRequest
0 голосов
/ 23 января 2012

В эти дни я использую приложение, в котором мне нужно использовать GWT в качестве уровня представления. Я узнал некоторые вещи, которые могут помочь мне справиться с моим проектом, но теперь у меня есть проблема, которую я не могу найти для этого хорошего решения.

Проблема в том, что когда я пытаюсь отправить объект, который я извлек из MySQL с помощью Hibernate с помощью Spring O Presentation Layer (GWT), я получаю следующее исключение:

com.google.gwt.user.client.rpc.SerializationException: Type 'org.hibernate.collection.PersistentBag' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [codes.shared.question@7e14d761, codes.shared.question@16165c24, codes.shared.question@15fb4ad0]

Я должен упомянуть, что хочу отправить класс с именем Exam, и у этого класса есть список класса вопросов.

Я буду очень благодарен за любую помощь, чтобы избавить меня от этой проблемы.

Ответы [ 2 ]

1 голос
/ 23 января 2012

Вы должны использовать объекты передачи данных, потому что на клиентскую сторону GWT могут быть переданы только DTO.

Вы должны создать ExamDto и QuestionDto, и после получения объекта Exam из MySQL вам пришлось преобразовать его в ExamDto.

На стороне клиента вы будете работать только с DTO.Если вы хотите сохранить Exam в MySQL, вам необходимо преобразовать ExamDto в Exam.

Чтобы преобразовать POJO в DTO и обратно, вы должны использовать Dozer .

. Чтобы использовать Dozer, вынеобходимо сопоставить DTO и POJO, используя сопоставления Dozer.Я использую Пользовательские сопоставления через XML-файлы Dozer .

Лучший учебник, описывающий отношения GWT-Hibernate: Использование GWT с Hibernate

Также яСоздал конвертор класса DozerGenerator и использовал его в своих приложениях.Например, у меня есть 2 RPC - один для поиска пользователей, второй - для сохранения пользователя.

    public UserDto findUserById(long id) throws IllegalArgumentException {
    //userService.findUserById(long id) returns User object and than 
    //you need to convert it to UserDto to transfer to client.
        return DozerGenerator.appUserEntityToDto(userService.findUserByID(id));
    }
    //here, you converts UserDto to User
    public Long saveUser(UserDto userDto) throws IllegalArgumentException {                
        return userService.saveUser(DozerGenerator.appUserDtoToEntity(mapper, userDto));
 }

А вот его класс DozerGenerator:

public class DozerGenerator {

    /* User <-> UserDto */
        public static User appUserDtoToEntity(DozerBeanMapper mapper, UserDto dto) {
            return mapper.map(dto, User.class);
        }

        public static UserDto appUserEntityToDto(DozerBeanMapper mapper, User user) {
            return mapper.map(user, UserDto.class);
        }

        public static List<UserDto> appUserListEntityToDto(DozerBeanMapper mapper, List<User> users) {
            List<UserDto> models = new ArrayList<UserDto>();
            for (User u : users) {
                models.add(DozerGenerator.appUserEntityToDto(mapper, u));
            }
            return models;
        }

        public static List<User> appUserListDtoToEntity(DozerBeanMapper mapper, List<UserDto> dtos) {
            List<User> users = new ArrayList<User>();
            for (UserDto u : dtos) {
                users.add(DozerGenerator.appUserDtoToEntity(mapper, u));
            }
            return users;
        }
}

Также я использую GWT +Spring + JPA + Hibernate в моих приложениях без каких-либо специальных библиотек, таких как spring4gwt и gilead (hibernate4gwt), и он отлично работает.

Вы также можете найти информацию о вашей ошибке здесь Issue 3296

0 голосов
/ 23 января 2012

Вы join fetch редактировали список с экзаменом, я думаю, что это ленивая коллекция, которая еще не инициализирована (не заполнена)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...