这一天,我强制使用一个应用程序,我需要使用GWT作为表示层。我已经学到了一些可以帮助我处理项目的事情,但现在我遇到了一个问题,我无法找到一个好的解决方案。
问题在于,当我尝试通过spring o表示层(GWT)发送我使用Hibernate从MySQL检索到的对象时,我得到了这个异常:
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的课程,这个课程有一个问题类列表。
我会非常感激地帮助解决这个问题。
答案 0 :(得分:1)
您应该使用数据传输对象,因为只有DTO可以传输到GWT客户端。
您应该创建ExamDto和QuestionDto,在从MySQL接收Exam对象后,您必须将其转换为ExamDto。
在客户端,您将只运行DTO。如果您想将考试保存到MySQL,您应该将ExamDto转换为考试。
要将POJO转换为DTO并返回,您应该使用Dozer。
要使用Dozer,您需要使用Dozer映射来映射DTO和POJO。我使用Custom Mappings Via Dozer XML Files。
描述GWT-Hibernate关系的最佳教程:Using GWT with 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
找到有关错误的一些信息答案 1 :(得分:0)
您是否join fetch
在考试中列出了该列表,我认为这是一个懒惰的集合,尚未初始化(已填充)