2013-12-19 5 views
0

정말 이상한 문제가 있습니다. 나는 수업Java/cglib 메소드를 무시할 때 super 만 호출합니까?

public class A extends ...{ 

} 

public class B extends A{ 

    @Override 
    @PreAuthorize(...) 
    public String doMagic(){ 
     String v = super.doMagic(); 
     doSomeOtherThings(); 
     ... 
     return v; 
    } 
} 

을 확장 여러 클래스가 있었다, 그래서 나는에 그것을 리팩토링 : 내가 가진

...

public class A extends ...{ 

    @Override 
    public String doMagic(){ 
     String v = super.doMagic(); 
     doSomeOtherThings(); 
     ... 
     return v; 
    } 
} 

public class B extends A{ 

    @Override 
    @PreAuthorize(...) 
    public String doMagic(){ 
     return super.doMagic(); 
    } 
} 

하지만 지금은 흥미로운 일이 일어난 액세스 권한을 확인하는 테스트 (PreAuthorize 기반), IntelliJ에서 제대로 실행되지만 maven으로 실행될 때 실패합니다. B의 메소드가 무시되거나 주석이 처리되지 않는 것 같습니다. 첫 번째 버전에서는 테스트가 두 경우 모두 통과합니다.

어떤 아이디어가 있었습니까? 이 .. 문제가 CGLIB 관련이있을 수 있다는

을 보인다는 이러한 경우 다시 작동 : 프록시를 만들려면 : 당신이 제공 한 정보와

public class A extends ...{ 

    protecte String doMagic2(){ 
     String v = super.doMagic(); 
     doSomeOtherThings(); 
     ... 
     return v; 
    } 
} 

public class B extends A{ 

    @Override 
    @PreAuthorize(...) 
    public String doMagic(){ 
     return doMagic2(); 
    } 
} 
+0

당신은 당신의 아이디와 아이디에서 같은 jdk를 고소하고 있습니까? –

+0

A가 확장하는 클래스에 대한 자세한 내용을 게시해야합니다. 도움이 될 수도 있습니다. – djangofan

+0

A는 비즈니스 서비스를 확장하며 액세스 제어와 관련이 없습니다. – zibi

답변

3

이 가장 가능성이 일어나는 것이다 , cglib는 인터셉트되어야하는 모든 메소드를 오버라이드 (override)하는 서브 클래스를 실행시에 작성합니다. 그러나이 개념은 프록시 메소드의 런타임 구현이 무시되기 때문에 명시 적으로 수퍼 클래스에 도달하는 호출을 차단할 수 없습니다. 나는 여기에서 이것을 정교하게 만들었다. Why does cglib not proxy super invocations?

또한, 메소드가 cglib에 의해 오버라이드 될 때, 오버라이드 된 메소드의 주석은 더 이상 존재하지 않는다. 어떤 시점에서 @PreAuthorize-annotated 메소드가 cglib이 생성 한 런타임 하위 클래스를 적용한 후 주석이 더 이상 보이지 않도록 proxing한다고 가정합니다.

Maven과 IntelliJ의 결과가 다른 경우 코드를 구성하지 않아도되므로 설정에 오류가 발생할 가능성이 큽니다.