2011-11-14 27 views
15

mam Wiosna fasoli, powiedzmy:Czy można zrezygnować z obsługi Spring bean?

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class AImpl implements A { 

    public void setSomeDependency(D dependency) { 
     // This setter DOES NOT BELONG to interface A 
    } 
} 

<bean id="aImpl" class="AImpl"/> 

Teraz chcę przetestować integracji, ale najpierw muszę kpić zależność D, ponieważ ma zbyt wiele rzeczy. Ponieważ AImpl implementuje interfejs i zawiera transakcyjnej adnotacji, wygenerowany proxy jest kompatybilny tylko z interfejsem A, więc mogę to zrobić:

@Inject @Named("aImpl") 
private A a; 

ale nie może:

@Inject @Named("aImpl") 
private AImpl a; 

W rezultacie, Nie mogę kpić z mojej zależności.

Należy pamiętać, że dodanie void setSomeDependency(D dependency) do interfejsu A nie jest opcją, ponieważ nie ma żadnego znaczenia biznesowego. Ani nie używa on proxy-target-class="true", ponieważ łamie wiele innych komponentów bean (ten atrybut dotyczy wszystkich komponentów w kontekście).

Czy istnieje sposób na odblokowanie wstrzykniętej fasoli A, aby można było przesłać ją do AImpl?

+0

możliwy duplikat [Casting wiosennego Proxy obiektu do rzeczywistej klasy środowiska wykonawczego] (http://stackoverflow.com/questions/5976247/casting-a-springs-proxy-object-to-tact--ualual-rime-class) – skaffman

+0

@skaffman: dzięki za wskazanie, dodałem to pytanie do tagu wiosna FAQ –

Odpowiedz

22

Spróbuj tego:

if(AopUtils.isAopProxy(a) && a instanceof Advised) { 
    Object target = ((Advised)a).getTargetSource().getTarget(); 
    AImpl ai = (AImpl)target; 
} 

Bonus: w Scala Używam następujący równoważną funkcję dla tego samego celu:

def unwrapProxy(a: AnyRef) = a match { 
    case advised: Advised if(AopUtils.isAopProxy(advised)) => 
          advised.getTargetSource.getTarget 
    case notProxy => notProxy 
} 
+8

Dzięki, naprawdę mnie uratowałeś. BTW, właśnie odwiedziłem Oslo po raz pierwszy, teraz nie zastanawiam się, dlaczego spędzasz tak dużo czasu na SO (bez obrazy oznaczało, ale pogoda nie zachęca) :) – MaDa

+2

Cieszę się, że mogę pomóc. Spodobał mi się twój komentarz tak bardzo, że nawet zacytowałem go na mojej stronie profilu ;-). –

8

Wraz z wprowadzeniem wiosennego 4.2.RC1 istnieje teraz dedykowana klasa narzędziowa w module spring-test, która obsługuje tę skrzynkę.

Klasa nazywa AopTestUtils i dostarcza metod:

  • getTargetObject (odwija ​​tylko proxy podstawowy)
  • getUltimateTargetObject (odwija ​​wiele poziomów serwerów proxy, jeśli takie istnieją).

Sprawdź odpowiedni commit, a także odpowiedni issue.

Powiązane problemy