どのように私はCGLIBを持つクラスをダブル向上させることができますか?
質問
ここでは、コードです。
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()をチェックすることが適切なスーパークラスを見つける必要があることを指摘したかっます。
所属していません StackOverflow