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の遅延ロードオブジェクトを変換すると、エラーが発生します.ここの誤りを解決するために、私たちはネットユーザーのネット上で与えた解決構想を参考にすることができます.