2010-06-23 6 views
8

Mam interfejs usługi z wieloma metodami, z których wszystkie pobierają obiekt żądania i zwracają obiekt odpowiedzi. Wszystkie obiekty żądania mają wspólny przodek, a wszystkie obiekty odpowiedzi mają inny wspólny przodek (który ma flagę sukcesu i pole komunikatu).Wyrażenie wypukłe aop sprężynowe, aby uzyskać dostęp do metody zwracania typu:

Teraz chcę mieć aspekt, który sprawdza uprawnienia itp., Wykonuje wywołanie usługi i zwraca obiekt odpowiedzi z kodem błędu, jeśli coś się nie powiedzie. Problem polega na tym, że muszę wiedzieć, jaki typ obiektu Response utworzyć. Czy istnieje wyrażenie skrótowe, które daje mi dostęp do typu zwracanego? Coś w tym stylu, być może?

@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

A więc chcesz doradzić kilka metod o tym samym aspekcie, które czasem muszą produkować i zwracać obiekt odpowiedzi bez wywoływania usługi, a obiekt odpowiedzi musi być odpowiedniego podtypu dla metody usługi? –

+0

tak, dokładnie to chcę –

Odpowiedz

6

Javadoc dla JoinPoint wspomina getSignature() metodę, której zwrot typ Signature posiada interfejs sub MethodSignature możesz spróbować rzucić, która ma metodę getReturnType(), która może być tym, czego szukasz.

+0

Jestem tego świadomy. to jest sposób, w jaki jestem gotów pójść, jeśli nie istnieje lepsze rozwiązanie, ale wolałbym wypunktowane wyrażenie. –

0

można to zrobić sprawdź, czy wewnątrz metody doradztwa wokół (handleServiceCall() w twoim przypadku)

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

Wiem, ale to nie pomoże, ponieważ nie zawsze będę robić pjp.proceed(). Jeśli mój aspekt zdecyduje, że użytkownik nie ma prawa wykonać wywołania serwisowego, utworzy obiekt odpowiedzi bezpośrednio, bez kontynuowania. –

+0

Nie należy używać "*" jako "wzorca typu ret" w wyrażeniu wskazującym. Zamiast tego użyj rzeczywistego typu zwrotu metody, którą chcesz przechwycić. – chedine

+0

no good: chcę przechwycić wiele różnych typów zwrotu i chcę wiedzieć, który mam. –

Powiązane problemy