json変換hibernate結果セットオブジェクトの解決
5140 ワード
ext+ssh , jsonlib hibernate , 。 , , :
public static JsonConfig getCommonConfig() {
/*---- start------*/
JsonConfig conf = new JsonConfig();
conf.registerJsonBeanProcessor(
org.hibernate.proxy.HibernateProxy.class,
new HibernateJsonBeanProcessor());
conf.setJsonBeanProcessorMatcher(new HibernateJsonBeanProcessorMatcher());
return conf;
}
}
class HibernateJsonBeanProcessorMatcher extends JsonBeanProcessorMatcher {
@Override
public Object getMatch(Class target, Set set) {
if (target.getName().contains("$$EnhancerByCGLIB$$")) {
return org.hibernate.proxy.HibernateProxy.class;
}
return DEFAULT.getMatch(target, set);
}
}
class HibernateJsonBeanProcessor implements JsonBeanProcessor {
public JSONObject processBean(Object obj, JsonConfig jsonConfig) {
LazyInitializer lazyInitializer = ((HibernateProxy)obj).getHibernateLazyInitializer();
if(lazyInitializer.isUninitialized()) {
}
return new JSONObject();
}
}
この場合,エラーは解決されるが,出力されるjsonオブジェクト列はxxx:{}である.
しかし、これらのデータが必要で、ネット上で問題の解決方法を与えるのはvoなどを使うので、個人的にはこのように長くないvoを作成する必要があり、使用が煩雑だと感じています.そこで,反射を用いてhibernateのエージェントのデータを取り出し,通常の対応オブジェクトに変換することを自分で考えた.結果はまあまあ、成功しました.しかし、性能はテストされておらず、個人的には反射が性能の損失をもたらすと考えられている.今コードが貼られて、みんなはレンガをたたいて、どの方面が改善する必要があるかを分析します.
現在は1レベルのキャプチャしかサポートされていません.
ext+sshフレームワークの使用中、jsonlibを使用してhibernateの遅延ロードオブジェクトを変換すると、エラーが発生します.ここの誤りを解決するために、私たちはネットユーザーのネット上で与えた解決構想を参考にすることができます.
/**
*
* : hibernate
* @param dataList
* @param clazz class
* @return: void
* @author: lb
* @version: 2.0
*/
public static List listCrawl(List dataList,Class clazz){
String ss="java.lang.String,java.util.Date,java.lang.Integer,java.lang.Long,int,float,long";
String filterType="java.util.Map,java.util.HashMap,java.util.Set,java.util.HashSet";
try{
for(int i=0;i<dataList.size();i++){
Object originalObj=dataList.get(i);//
Method[] originalMethods= clazz.getDeclaredMethods();//
for(Method originalMethod:originalMethods){
System.out.println("original MethodName: "+originalMethod.getName());
if(originalMethod.getName().contains("get")){
System.out.println("getMethod returnType: "+originalMethod.getReturnType().getName());
String returnType=originalMethod.getReturnType().getName();//get
if(!ss.contains(returnType)&&!filterType.contains(returnType)){// Set Map ,
Object proxyObjct=originalMethod.invoke(originalObj, null);// hibernate
if(proxyObjct!=null){//
Class proxyClass=proxyObjct.getClass();
Method[] proxyMethods=proxyClass.getDeclaredMethods();
Class tempClazz=Class.forName(returnType);// hibernate
Object tempObject=tempClazz.newInstance();// hibernate
for(Method proxyMethod:proxyMethods ){//
if(ss.contains(proxyMethod.getReturnType().getName())){// hibernate
if(proxyMethod.getName().contains("get")){
Object returnValue=proxyMethod.invoke(proxyObjct, null);//
System.out.println("proxy returnValue:"+returnValue);
String setMethod=proxyMethod.getName().replace("get", "set");
System.out.println("setMethod name:"+setMethod);
Method tempMethod=tempClazz.getDeclaredMethod(setMethod, proxyMethod.getReturnType());
tempMethod.invoke(tempObject, returnValue);
}
}
}
Method originalMethod1=clazz.getDeclaredMethod(originalMethod.getName().replace("get", "set"), originalMethod.getReturnType());
originalMethod1.invoke(originalObj, tempObject);// hibernate
}
}
}
}
}
}catch(Exception e){
System.out.println(" ");
e.printStackTrace();
}
return dataList;
}
この場合,エラーは解決されるが,出力されるjsonオブジェクト列はxxx:{}である.
しかし、これらのデータが必要で、ネット上で問題の解決方法を与えるのはvoなどを使うので、個人的にはこのように長くないvoを作成する必要があり、使用が煩雑だと感じています.そこで,反射を用いてhibernateのエージェントのデータを取り出し,通常の対応オブジェクトに変換することを自分で考えた.結果はまあまあ、成功しました.しかし、性能はテストされておらず、個人的には反射が性能の損失をもたらすと考えられている.今コードが貼られて、みんなはレンガをたたいて、どの方面が改善する必要があるかを分析します.
現在は1レベルのキャプチャしかサポートされていません.
ext+sshフレームワークの使用中、jsonlibを使用してhibernateの遅延ロードオブジェクトを変換すると、エラーが発生します.ここの誤りを解決するために、私たちはネットユーザーのネット上で与えた解決構想を参考にすることができます.