2009-08-14 2 views
3

Hier ist der Code:Wie kann ich eine Klasse mit cglib doppelt verbessern?

Patient patient = factory.createPatient();   

    Enhancer enhancer = new Enhancer(); 
    enhancer.setSuperclass(patient.getClass()); 
    enhancer.setCallback(new DefaultMethodInterceptor(patient)); 
    patient = (Patient) enhancer.create(); 

    assertThat(patient.getFirstName()).isNotNull(); 


    Enhancer enhancer2 = new Enhancer(); 
    enhancer2.setSuperclass(patient.getClass()); 
    enhancer2.setCallback(new DefaultMethodInterceptor(patient)); 
    patient = (Patient) enhancer2.create(); 

    assertThat(patient.getFirstName()).isNotNull(); 

Es mit

net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null 
... 
Caused by: java.lang.reflect.InvocationTargetException 
... 
Caused by: java.lang.ClassFormatError: Duplicate method name&signature in class file my/package/entity/Patient$$EnhancerByCGLIB$$ca1e6685$$EnhancerByCGLIB$$f52743be 

ich dies am letzten assert nicht fragen, weil ich Hibernate will die Einheiten verbessern, aber manchmal gibt sie bereits diejenigen verstärkt von selbst und meinem zweiten Verbesserung schlägt fehl. Wie kann ich das vermeiden?

Antwort

6

Sie müssen überprüfen, ob Ihre Klasse bereits über die Methode Enhancer.isEnhanced() erweitert wurde.

Wenn es ist, sollte Ihre 2. Erweiterung auf Original Klasse angewendet werden, nicht die bereits erweiterte Version wie Sie in dem obigen Code tun. Sie können Ihre Erweiterungen innerhalb der MethodInterceptor.intercept() Implementierung noch zusammenführen, aber Sie müssen das vorsichtig tun.

+0

Danke, das hat den Trick gemacht. Es fiel mir schwer zu entdecken, welche Klasse die ursprüngliche war, schließlich schaffte ich es, alles von $$$ EnhancerByCGLIB $$ aus dem Namen der Klasse zu schneiden. – artemb

2

Dies war auch sehr hilfreich für mich. Wollte nur darauf hinweisen, dass getSuperclass() die Kette aufruft und Enhancer.isEnhanced() für jedes überprüft, sollte die richtige Oberklasse suchen.

Verwandte Themen