Domanda

Ecco il codice:

    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();

Non riesce l'ultima asserzione con

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

Lo chiedo perché voglio migliorare le entità di Hibernate, ma a volte restituisce già migliorato quelli di per sé e il mio secondo valorizzazione fallisce. Come posso evitare questo?

È stato utile?

Soluzione

È necessario verificare se la classe è già migliorata tramite il metodo Enhancer.isEnhanced().

Se lo è, il vostro secondo valorizzazione dovrebbe essere applicata a originale di classe, non la versione avanzata già come si fa in codice di cui sopra. È ancora possibile composti i vostri miglioramenti nell'ambito dell'attuazione MethodInterceptor.intercept() ma devi farlo con cura.

Altri suggerimenti

Questo è stato molto utile per me, pure. Volevo solo far notare che la chiamata getSuperclass () a monte della catena e controllo Enhancer.isEnhanced () per ogni dovrebbe individuare il corretto superclasse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top