iteye_12977 2010-03-16 09:42
浏览 204
已采纳

sojo或者jsonlib转换hibernate PO的问题

这个问题我不断尝试解决了一晚上,但是仍没有进展。我不是不想自己动手解决问题,只是实在能力有限,固向大家求教求教!
项目中采用spring MVC做为控制层,持久层用了Hibernate。我将hibernate查处的PO或者List返回到controller。
在控制层中使用了spring-json-view来生成json数据返回到页面。
可无论使用sojo或jsonlib都没有办法避免读取延迟加载的字段或Set,而此时一定会报出org.hibernate.LazyInitializationException。
我尝试过些jsonlib的filter如下:
[code="java"]
@InitBinder
protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
JsonWriterConfiguratorTemplateRegistry registry = JsonWriterConfiguratorTemplateRegistry.load(request);
registry.registerConfiguratorTemplate(new JsonlibJsonWriterConfiguratorTemplate() {
@Override
public JsonConfig getJsonConfig() {
JsonConfig config = new JsonConfig();
// Exclude all date properties
config.setJsonPropertyFilter(new PropertyFilter() {
@SuppressWarnings("unchecked")
public boolean apply(Object source, String name,Object value) {
if(source instanceof java.util.Map){
return false;
}
Field declaredField = null;
try {
declaredField = source.getClass()
.getDeclaredField(name);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
// 忽略集合
if (declaredField != null) {
if (declaredField.getType() == Collection.class
|| declaredField.getType() == Set.class
|| declaredField.getType() == Map.class
|| declaredField.getType() == List.class) {
return true;
}
}
return false;
}
});
return config;
}
});
}
[/code]

也尝试过配置sojo的config,如下:
[code="java"]
binder.registerCustomEditor(Menu.class, new CustomCollectionEditor(Set.class, false));

JsonWriterConfiguratorTemplateRegistry registry = JsonWriterConfiguratorTemplateRegistry.load(request);
registry.registerConfiguratorTemplate(new SojoJsonWriterConfiguratorTemplate(){
@Override
public SojoConfig getJsonConfig() {
SojoConfig config = new SojoConfig();
String[] excludes ={"name"};
config.setExcludedProperties(excludes);
return config;
}
});*/
[/code]

但都无法解决上述问题。原因当然是因为Hibernate代理了实体,而只要尝试读取lazyLoad的数据就会报错。而使用open-session-in-view的模式,又会白白的查询很多数据出来,这些数据,页面是不需要的。
莫非要把对象copyProperties一个?那也会读取lazy数据的!
请问大家有没有好的解决方案。多谢 多谢!

  • 写回答

1条回答 默认 最新

  • wanghaolovezlq 2010-03-16 10:04
    关注

    // 忽略集合

    if (declaredField != null) {

    if (declaredField.getType() == Collection.class

    || declaredField.getType() == Set.class

    || declaredField.getType() == Map.class

    || declaredField.getType() == List.class) {

    return true;

    }

    }

    这个地方的判断不对,应该是判断是否是这些集合类或它的子类

    declaredField.getType().isAssignableFrom(Set.class) 这种方式

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题