2015-08-24 32 views
6

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.

risposta

6

Come risulta, il mio Aspetto e i miei Controller NON erano, in effetti, nello stesso contesto.

Mentre credevo i miei controller da inserire nel contesto di scansione della mia web-context.xml, sono stati effettivamente sottoposti a scansione in WEB-INF/servlet-context.xml

Una volta ho spostato la mia configurazione di aspetto per WEB-INF/servlet-context.xml, il mio Aspect ha iniziato a triggerare come previsto.

Grazie per tutti coloro che hanno contemplato il mio problema.

+0

Di fronte allo stesso problema e non riesco a trovare il motivo. Qualche suggerimento su quali configurazioni controllare? –

+0

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

0

Calcolare con certezza dove verrà configurato il servizio in primavera. Se si dispone di un'icona, è possibile fare clic per accedere alla configurazione del bean Spring. Quindi assicurarsi che l'aspetto sia configurato nello stesso file.

Se sono definiti definitivamente nello stesso file, controllare dopo che il consiglio di pointop aop corrisponde al metodo su cui si prevede che si attivi. Ancora una volta, Idea ha un'icona accanto al punto di accesso che passerà ai metodi di corrispondenza.

Problemi correlati