sojo或者jsonlib转换hibernate PO的问题

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数据的!
请问大家有没有好的解决方案。多谢 多谢!

// 忽略集合

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) 这种方式