Consigli di spring AOP su controllori annotati

Sto cercando di utilizzare AOP per eseguire alcune elaborazioni dopo un controller annotato. Tutto funziona senza errori, ma il consiglio non viene eseguito.

Ecco il codice del controller:

@Controller public class HomeController { @RequestMapping("/home.fo") public String home(ModelMap model) { model = new ModelMap(); return "home"; } } 

e l’installazione in application-config

        

e il consiglio reale

 public class TestAdvice implements AfterReturningAdvice { protected final Log logger = LogFactory.getLog(getClass()); public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { logger.info("Called after returning advice!"); } } 

È persino ansible avere consigli sui controller annotati? Sto usando Spring 2.5.

È ansible avere consigli sui controller annotati.

Presumo che tu voglia consigliare dopo l’esecuzione di tutti i metodi nelle classi annotate con @Controller .

Ecco un esempio:

 import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; @Aspect public class ControllerAspect { @Pointcut("within(@org.springframework.stereotype.Controller *)") public void controllerBean() {} @Pointcut("execution(* *(..))") public void methodPointcut() {} @AfterReturning("controllerBean() && methodPointcut() ") public void afterMethodInControllerClass() { System.out.println("after advice.."); } } 

Se si desidera utilizzare Spring AOP con la syntax di AspectJ, è necessario anche un file di configurazione come questo:

        

Nota: con Spring AOP, il contenitore Spring tesserà solo i fagioli Spring. Se l’object @Controller non è un bean Spring, è necessario utilizzare la tessitura AspectJ.

Ho avuto lo stesso problema in cui la consulenza per il repository stava funzionando, ma i consigli per il controller non lo erano. Finalmente ho trovato una soluzione. In breve, è necessario assicurarsi che la definizione AOP sia caricata nel contesto di Servlet, non in un contesto diverso.

Nel mio caso, la mia definizione Spring AOP è definita in tools-config.xml . Dopo averlo spostato da qui

  contextConfigLocation classpath:spring/tools-config.xml   org.springframework.web.context.ContextLoaderListener  

a qui,

  petclinic org.springframework.web.servlet.DispatcherServlet  contextConfigLocation classpath:spring/mvc-core-config.xml, classpath:spring/tools-config.xml  1  

il consiglio per Controller sta funzionando.

Per i controller MVC il metodo preferito per realizzare ciò che si sta tentando di fare è utilizzare gli intercettori. Vedi http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor