0%

修复 Hibernate PersitentMap 在Dozer中的Bug

一、Hibernate PersitentMap 在SpringBoot中使用Dozer进行类型转换时的Bug

我们知道,Dozer已经很久没有人维护了,其实它是有一些bug的,但是却因没人维护导致这些bug日久无人修。

前些天在JPA中使用Map作为Entity属性时,在到达Dozer转换成VO的时候,抛出了no session的错误。

但是我已经给SpringBoot加上了open-in-view的属性,应该不会出现这个问题的,所以经过多番配置可以排出open-in-view的原因。后查看dozer的源码,才发现,其实是dozer的问题。

二、原因所在

在entity中,我们的代码是这样的:

1
2
3
class User {
private Map<String, String> settings;
}

在vo中,我们的代码是这样的:

1
2
3
class UserVO {
private Map<String, String> settings;
}

由于使用Hibernate作为JPA的provider,User实体在加载出来之后,settings是一个PersitentMap。

但是在dozer对po->vo时,发现vo的settings为空,则会克隆一个po的settings到vo,也就是说,这时vo的settings是一个PersitentMap。又因为转化成JSON的时候是在view之外,所以就没有session,导致no session的错误异常。

三、处理方案

在VO处显示初始化一个非PersistentMap的实现,例如 HashMap等:

1
2
3
class UserVO {
private Map<String, String> settings = new HashMap<>();
}

这样,dozer在获取vo时,settings不为空,则会将po的settings全部添加到vo的settings,这时仍在session范围内,所以不会再报错。

四、总结

查看代码、调试代码的能力很重要,要学会分析断点代码,方能知道关键节点出现的异常问题。