使用AspectJ的Spring MVC

我有一个工作的spring mvc项目。 我想使用AspectJ通过我的控制器记录每个请求。 相关代码:

控制器:(在hu.freetime.controller包中)

@Controller @RequestMapping("/") public class BaseControllerImpl { @RequestMapping(method = RequestMethod.GET) public String index(Model model) { return "index"; } } 

方面:

 @Aspect public class ControllerAspectImpl { Logger logger = LoggerFactory.getLogger(ControllerAspectImpl.class); @Pointcut("execution(public * hu.freetime.controller.BaseControllerImpl.*(..))") public void logController() { } @Around("logController()") public void log(final ProceedingJoinPoint pjp) { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); logger.info("Calling Controller method: " + method.getName() + "()"); try { pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } } } 

WebAppInitializer:

 public class CashflowWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class[] getRootConfigClasses() { return new Class[] { RootConfig.class }; } @Override protected Class[] getServletConfigClasses() { return new Class[] { WebConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } } 

WebConfig类:

 @Configuration @EnableWebMvc @EnableAspectJAutoProxy @ComponentScan(basePackages = { "hu.freetime.controller", "hu.freetime.aspect" }) public class WebConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); resolver.setExposeContextBeansAsAttributes(true); return resolver; } @Bean public ControllerAspectImpl getControllerAspect() { return new ControllerAspectImpl(); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } 

问题是,两个组件中只有一个正在工作。 如果我“关闭”AOP,MVC工作正常,但是当我“打开”,我想要转到主页面时,我收到此错误:

 HTTP Status 404 - .../WEB-INF/views/.jsp The requested resource is not available. 

奇怪的是它想要映射“.jsp”而不是“index.jsp”,正如我在Controller的index()方法中所写的那样。 我在运行时调试,它确实在控制器方法停止。

我怎样才能使它工作?

你的建议不会返回pjp.proceed()的结果。 这是建议方法的返回值, 必须由建议返回! 否则,您也将建议的方法转换为空白。

 public **Object** log(final ProceedingJoinPoint pjp) { ... try { **return** pjp.proceed(); <<< ! } catch (Throwable e) { e.printStackTrace(); } } 

使用下面的代码它将起作用

 @Pointcut("execution(public * hu.freetime.*(..))")