Question

Voici le code:

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

Il échoue sur la dernière assert avec

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

Je demande cela parce que je veux améliorer les entités Hibernate, mais parfois, il retourne déjà amélioré les par lui-même et mon deuxième amélioration échoue. Comment puis-je éviter cela?

Était-ce utile?

La solution

Vous devez vérifier si votre classe est déjà améliorée par méthode Enhancer.isEnhanced().

Dans ce cas, votre 2ème amélioration devrait être appliquée à d'origine classe, pas la version améliorée déjà comme vous le faites dans le code ci-dessus. Vous pouvez toujours composer vos améliorations au sein de la mise en œuvre de MethodInterceptor.intercept() mais vous devez le faire avec soin.

Autres conseils

Ce me fut très utile, aussi bien. Je voulais juste souligner que l'appel getSuperclass () la chaîne et la vérification Enhancer.isEnhanced () pour chaque doit localiser la superclasse appropriée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top