2017-09-07 1 views
0

Ich bin neu mit Frühling AOP und ich frage mich, ob es möglich ist, einen Wert von @Before zur Methode zurückzukehren und diese Variable im Innern zu verwenden, zum Beispiel:Frühling AOP @Before Beratung Rückgabewert

@Before("@annotation(CheckUserReservationPermission) && args(username,idReservation)") 
public Reservation userCreationAdvice(ProceedingJoinPoint pjp, String username, Integer idReservation) throws Throwable { 
    Reservation reservation = reservationServices.findById(idReservation); 
    if (!reservation.getUser().getUsername().equals(username)) 
     throw new PermissionException("You can't delete the reservation with id: " + idReservation); 
    return reservation; 
} 

und meine Methode:

@Override 
@CheckUserReservationPermission 
public void deleteReservationById(String username, Integer idReservation) throws QueryException { 
    synchronized(ReservationsSchedulerServicesImpl.class){ 
     databaseReservationServices.deleteReservationById(username, reservation); 
    } 
} 

Gibt es eine Möglichkeit, dies zu machen? Ansonsten muss ich die Abfrage wiederholen. Dank

UPDATE: Mit @Around kann ich diesen Code haben, aber wie kann ich die Variable in deleteReservationById Methode abrufen?

@Around("@annotation(CheckUserReservationPermission) && args(username,idReservation)") 
public Object userCreationAdvice(ProceedingJoinPoint pjp, String username, Integer idReservation) throws Throwable { 
    Reservation reservation = reservationServices.findById(idReservation); 
    if (!reservation.getUser().getUsername().equals(username)) 
     throw new PermissionException("You can't delete the reservation with id: " + idReservation); 
    return pjp.proceed(new Object[] {reservation}); 
} 
+0

können wir um Rat verwenden? – VedX

+0

Nein, du kannst nicht. Sie können nur einen Wert aus einem Rund-Tipp zurückgeben. –

+0

und mit einem um Rat kann ich die Variable mit der Methode verwenden? – luca

Antwort

0

Edit 2:

  1. Tipps

    @Around("@annotation(CheckUserReservationPermission) && args(username,idReservation)") 
    public Object userCreationAdvice(ProceedingJoinPoint pjp, DeleteByIdRequest req) throws Throwable { 
        Reservation reservation = reservationServices.findById(idReservation); 
        if (!reservation.getUser().getUsername().equals(username)) { 
         throw new PermissionException("You can't delete the reservation with id: " + idReservation);} 
    
        req.setReservation(reservation); 
        return pjp.proceed(new Object[] {req}); 
    

    }

2. Neue Anfrage POJO

class DeleteByIdRequest { 
     Reservation reservation; 
     String username; 
     Integer idReservation; 
    } 

3.Target Methode

@Override 
@CheckUserReservationPermission 
public void deleteReservationById(DeleteByIdRequest request) throws QueryException { 
    synchronized(ReservationsSchedulerServicesImpl.class){ 
     databaseReservationServices.deleteReservationById(username, reservation); 
    } 
} 

die Schnittstellen dieser Hinweise Siehe

Kontrolle, was sie zurück.

1.ThrowsAdvice

public void afterThrowing(IllegalArgumentException e) throws Throwable { 
} 

2.AfterReturningAdvice

public void afterReturning(Object returnValue, Method method, 
     Object[] args, Object target) throws Throwable { 
} 

3.MethodBeforeAdvice

public void before(Method method, Object[] args, Object target) 
     throws Throwable { 

} 

4.MethodInterceptor (Around Beratung)

public Object invoke(MethodInvocation methodInvocation) throws Throwable { 

} 

Wenn Sie im 4. Punkt notieren nur Around Beratung gibt Objekt zurück.

Sie müssen die JoinPoint.proceed() definieren, um zu steuern, wann der Interzeptor das Steuerelement an die ursprüngliche Methode zurückgeben soll.

prüfen einfaches Beispiel here

EDIT: ich denke, das mit Hilfe von
proceeding with arguments erreicht werden kann Grundsätzlich kann man dann vorgehen() aufrufen, mit den neuen Argumenten.

+0

Ich war auf der Suche nach '@ Around' aber wie kann ich' Reservierung' zu meiner Methode? – luca

+0

meinst du, wie dieses Objekt in deiner deleteReservationById() -Methode behandelt wird? – VedX

+0

überprüfen Sie bitte bearbeiten lassen Sie mich wissen, wenn irgendeine Verwirrung – VedX

Verwandte Themen