我有一个自动生成json的代码,就是通过反射所有的属性读取成json,但是由于我的bean是hibernate查询出来的bean,存在延时加载的对象时提示no session or session was closed错误信息,当然提示信息时很正常的,因为还没有加载的对象,到了Action中的时候,会话已经关系,如果解决这个问题
其实主要是通过代码进行分析,hibernate采用的cglib进行的对象的代理,只要能够判断出来他的类型就可以进行区别对待了,这里进行了代码的编写,通过反射取出一个对象的属性,然后判断这个属性的值的类型(注意一定不要使用取出来的值,包括toString也不行),判断是否是PO类型,如果是说明是延时加载的,自己进行处理就可以了,因为延时加载的目的就是不让他在前台显示i,所以可以过滤掉就可以了。
protected Object hibernateConvert(Object bean) {
if(bean instanceof HibernateProxy){
LazyInitializer lazyInitializer = ((HibernateProxy)bean).getHibernateLazyInitializer();
if(lazyInitializer.isUninitialized()){
//未初始化的处理 ,可以只是读取它的标志
lazyInitializer.getIdentifier();
}else
//已经初始化,可以直接读取初始化的值
lazyInitializer.getImplementation();
}
if(bean instanceof PersistentSet || bean instanceof PersistentList){
return new String[]{}; //对于集合Set类型的,由于没有读取出来,所以前台也不需要显示,直接赋空值
}
return bean; //其他的非Hibernate的对象,当正常对象处理
}
所有取出来的对象的值都经过这个方法进行处理,取得对象以后,在进行操作,这样就不会提示上面的错误信息了
天天碰新问题,天天解决新问题,。。。。。