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() 방법.

그렇다면 2차 개선 사항을 다음에 적용해야 합니다. 원래의 위 코드에서와 같이 이미 향상된 버전이 아닙니다.당신은 여전히 ​​​​내에서 개선 사항을 복합화할 수 있습니다 MethodInterceptor.intercept() 구현하지만 주의해서 수행해야 합니다.

다른 팁

이것은 나에게도 도움이되었습니다. getSuperClass () 호출을 체인을 위로 올리고 Enhancer.isenhanced ()를 확인하면 각각의 슈퍼 클래스를 찾아야한다고 지적하고 싶었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top