2010-06-23 3 views
8

나는 많은 메소드를 가진 서비스 인터페이스를 가지고 있는데, 이들은 모두 Request 객체를 취해 Response 객체를 리턴한다. 모든 요청 객체에는 공통 조상이 있고 모든 응답 객체에는 다른 공통 조상이 있습니다 (성공 플래그와 메시지 필드가 있음).메소드 리턴 타입에 접근하기위한 스프링 aop 포인트 컷 표현식

이제는 사용 권한을 확인하고 서비스 호출을 수행하고 실패한 경우 실패 코드가있는 응답 객체를 반환하는 주변 요소가 필요합니다. 문제는 다음과 같습니다. 만들려는 응답 개체의 유형을 알아야합니다. 거기에 반환 형식에 액세스 할 수있는 pointcut식이 있습니까? 아마 이런 거 겠지?

@Around(value = "execution(public *" 
    + " com.mycompany.MyService+.*(..))" 
    + " && args(request)" 
    + " && returning(returnType)" // something like this would be nice 

, argNames = "request,returnType") 
public Object handleServiceCall(final ProceedingJoinPoint pjp, 
    final Request request, 
    final Class<? extends Response> returnType){ ... } 
+0

서비스를 호출하지 않고 응답 객체를 생성하고 반환해야하는 동일한 애스펙트가있는 여러 메소드에 조언하고 해당 응답 객체가 서비스 메소드에 적합한 하위 유형이어야합니다. –

+0

그래, 그게 정확히 내가 원하는 건 –

답변

6

JoinPoint를위한 Javadoc가 그 반환 유형 Signature 하위 인터페이스가있는 getSignature() 방법을 언급 (귀하의 경우 handleServiceCall())이 주위의 조언 방법 내부 체크인을 할 수 MethodSignature 당신은 당신이 찾고있는 것일 수도있는 방법 getReturnType()을 가지고있는 캐스팅 해 볼 수 있습니다.

+0

나는 이것을 알고있다. 이것은 더 좋은 해결책이 없다면 내가 갈 준비가되어있는 방법이지만 포인트 컷 식을 선호한다. –

0

당신은

Object actuals = pjp.proceed(); 
if(actuals instanceof MyResponse){ 
//TO:DO: Your code here 
} 
+0

나도 알아,하지만 그게 도움이되지 않을거야 왜냐하면 난 항상 pjp.proceed()를하지 않을 것이기 때문이다. 내 측면에서 사용자가 서비스 호출을 실행할 권한이 없다고 판단하면 진행하지 않고 직접 응답 개체를 만듭니다. –

+0

pointcut 표현식에서 'ret-type-pattern'으로 '*'를 사용하지 마십시오. 대신 가로 채기를 원하는 메소드의 실제 리턴 유형을 사용하십시오. – chedine

+0

좋지 않음 : 여러 가지 다른 반환 유형을 가로 채고 싶습니다. 어떤 유형인지 알고 싶습니다. –

관련 문제