どのように私はCGLIBを持つクラスをダブル向上させることができますか?

StackOverflow https://stackoverflow.com/questions/1277771

  •  16-09-2019
  •  | 
  •  

質問

ここでは、コードです。

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

これは

との最後のアサートに失敗しました
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

私はHibernateのエンティティを強化したいので、私はこれを聞いて、時にはそれ自体がすでに強化されたものを返し、私の第二の拡張が失敗しました。私はこの問題を回避するにはどうすればよい?

役に立ちましたか?

解決

あなたは、あなたのクラスがすでにEnhancer.isEnhanced()メソッドを介して強化されているかどうかを確認する必要があります。

それがある場合は、

、あなたの第二の拡張は、の元のクラスではなく、あなたは上記のコードで行うように、既に強化されたバージョンに適用されなければなりません。あなたはまだMethodInterceptor.intercept()実装内あなたの機能強化を配合することができますが、あなたは注意してそれを行う必要があります。

他のヒント

これは、同様に、私には非常に役に立ちました。ただ、チェーンまでgetSuperclass()を呼び出し、それぞれにEnhancer.isEnhanced()をチェックすることが適切なスーパークラスを見つける必要があることを指摘したかっます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top