Ho creato un Aspetto che esegue un confronto dell'ID di base per garantire che un utente appartenga a uno stesso gruppo che ha creato l'entità richiesta. Ho avuto successo collegando il mio aspetto ai metodi @Service, ma non ha senso sul livello di servizio, e ho bisogno che sia collegato ai metodi @RestController. Quando provo a farlo, tutto sembra buono, ma il mio Aspetto non si attiva mai ei registri sono silenziosi.Spring 4 AOP @Aspect non si attiva per @RestController
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
contesto primavera
<context:annotation-config/>
<context:component-scan base-package="my.pkg"/>
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true"/>
Aspect
@Aspect
@Component
public class MyAspect {
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void controller() {}
@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void restController() {}
@Pointcut("args(java.security.Principal,..)")
public void principalArgPointcut() {}
@Around("(controller() || restController()) && principalArgPointcut()")
public Object validate(ProceedingJoinPoint point) throws Throwable {
doValidationBefore();
Object result = point.proceed();
doValidationAfter();
return result;
}
}
dove "doValidationBefore()" e "doValidationAfter()" sarà un'eccezione se la convalida non riesce .
E, infine, il mio RestController
@RestController
@RequestMapping("/my-path")
public class MyController {
@RequestMapping(value = "/{entityId}", method = RequestMethod.GET)
public @ResponseBody
ResponseEntity<MyEntity> getEntityDetails(Principal principal, @PathVariable("entityId") Long entityId) {
return new ResponseEntity(HttpStatus.OK);
}
}
Alcune cose da notare:
- Questo aspetto esatto funziona quando cambio il modello di esecuzione per abbinare servizi e mettila nel mio pacchetto di servizi.
- L'Aspect e il RestController si trovano nello stesso contesto
- Io uso IDE IDE e quando uso l'icona "vai a metodi consigliati" sull'aspetto, il metodo che sto testando è elencato nell'elenco dei metodi .
- Nessuno dei metodi elencati in "passare a metodi consigliati" stanno lavorando
Le cose che ho provato:
- ho aggiunto 3 librerie al mio pom.xml: org.aspectj: aspectjrt: 1.8.6, org.aspectj: aspectjtools: 1.8.6, cglib: cglib: 2.2.2. Nessuno di questi ha reso alcuna differenza.
- Ho provato a definire il mio Aspect e PointCuts direttamente nel contesto xml e rimuovendo le annotazioni, nessuna differenza.
- Ho provato a impostare il mio modello di esecuzione da applicare a TUTTI i metodi e non si è ancora attivato.
- Ho provato ad aggiungere un'interfaccia per il mio RestController, nessuna modifica.
Mi piacerebbe un po 'di aiuto qui, come ho cercato di risolvere questo per un po' di tempo. So che deve essere possibile.
Di fronte allo stesso problema e non riesco a trovare il motivo. Qualche suggerimento su quali configurazioni controllare? –
Hai salvato il mio giorno. Ho cercato su Google molto ma senza speranza fino a quando non ho letto il tuo post. Grazie mille – anhtuangv