Find below code I have created.
I want to log(AOP Advice before,after etc.) all controller methods, but advise apply only one controller (AuthenticationController) methods is executed, on second controller (UserManagerController) methods advise are not apply,both controller are in the same package(com.framework.controller),but I don't know whats go wrong?why its apply only one controller not other.
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Dispatcher Servlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
applicationContext.xml
<!-- Used to activate applied annotations in already registered beans in application context -->
<!-- Declares support for general annotations such as @Required, @Autowired, @PostConstruct, and so on -->
<context:annotation-config />
<context:component-scan base-package="com.framework.*"/>
<!-- ***************************************************************** -->
<!-- Declares explicit support for annotation-driven MVC controllers (i.e. @RequestMapping, @Controller, @RequestBody/ResponseBody) -->
<mvc:annotation-driven />
<!-- Logging Aspect -->
<bean id="frameworkLoggingAspect" class="com.framework.aspect.FrameworkLoggingAspect" />
<!-- Enable @AspectJ annotation support -->
<aop:aspectj-autoproxy proxy-target-class="true">
<aop:include name="frameworkLoggingAspect" />
</aop:aspectj-autoproxy>
Find my Aspect class FrameworkLoggingAspect.java
@Aspect
public class FrameworkLoggingAspect {
@Pointcut("execution(* com.framework.controller.*.*(..))")
public void beforeControllerMethod() {
}
@Pointcut("execution(* com.framework.controller.*.*(..))")
public void afterControllerMethod() {
}
@Before("beforeControllerMethod()")
public void logBeforeAllMethods(JoinPoint joinPoint) {
CustomLogger.info(" Before Name " + joinPoint.getSignature().getName());
CustomLogger.info(" Before Modifier " + joinPoint.getSignature().getModifiers());
}
@After("afterControllerMethod()")
public void logAfterAllMethods(JoinPoint joinPoint) {
CustomLogger.info(" After Name " + joinPoint.getSignature().getName());
CustomLogger.info(" After Modifier " + joinPoint.getSignature().getModifiers());
}}
Find Controller package(com.framework.controller)
AuthenticationController.java
@Controller
@RequestMapping("/authentication")
public class AuthenticationController {
@Autowired
AuthenticationService authenticationService;
@RequestMapping(value = "loginPage", method = RequestMethod.GET)
public ModelAndView loginPage(HttpServletRequest request, HttpServletResponse response) {
ModelMap map = new ModelMap();
CustomLogger.info("Inside Login Page");
return new ModelAndView("user.login", map);
}
@RequestMapping(value = "logout", method = RequestMethod.GET)
public ModelAndView loginOut(HttpServletRequest request, HttpServletResponse response) {
ModelMap map = new ModelMap();
CustomLogger.info("Inside logout Page");
return new ModelAndView("user.login", map);
}
@RequestMapping(value = "validateUser", method = RequestMethod.POST)
public ModelAndView validateUser(HttpServletRequest request, HttpServletResponse response) {
ModelMap map = new ModelMap();
CustomLogger.info("Inside validate user Page");
return new ModelAndView("user.dashboard", map);
}
}
UserManagerController.java
@Controller
@RequestMapping("/userManager")
public class UserManagerController {
@Autowired
UserManagerService userManagerService;
@RequestMapping(value = "view", method = RequestMethod.GET)
ModelAndView view(HttpServletRequest request, HttpServletResponse response) {
ModelMap map = new ModelMap();
CustomLogger.info("Inside User View Page");
return new ModelAndView("user.manager.view", map);
}
@RequestMapping(value = "saveUser", method = RequestMethod.POST)
ModelAndView saveUser(HttpServletRequest request, HttpServletResponse response) {
ModelMap map = new ModelMap();
CustomLogger.info("Inside Save User");
return new ModelAndView("user.manager.view", map);
}}
Find below output i am getting
below controller(FrameworkLoggingAspect) advise applying properly
advise before for method loginPage
INFO 2017-10-03 13:32:40,426 [http-nio-8080-exec-10] - com.framework.aspect.FrameworkLoggingAspect : Before Name loginPage
INFO 2017-10-03 13:32:40,426 [http-nio-8080-exec-10] - com.framework.aspect.FrameworkLoggingAspect : Before Modifier 1
INFO 2017-10-03 13:32:40,426 [http-nio-8080-exec-10] - com.framework.controller.AuthenticationController : Inside Login Page
advise after for method loginPage
INFO 2017-10-03 13:32:40,427 [http-nio-8080-exec-10] - com.framework.aspect.FrameworkLoggingAspect : After Name loginPage
INFO 2017-10-03 13:32:40,427 [http-nio-8080-exec-10] - com.framework.aspect.FrameworkLoggingAspect : After Modifier 1
advise before for method validateUser
INFO 2017-10-03 13:33:15,292 [http-nio-8080-exec-6] - com.framework.aspect.FrameworkLoggingAspect : Before Name validateUser
INFO 2017-10-03 13:33:15,293 [http-nio-8080-exec-6] - com.framework.aspect.FrameworkLoggingAspect : Before Modifier 1
INFO 2017-10-03 13:33:15,293 [http-nio-8080-exec-6] - com.framework.controller.AuthenticationController : Inside validate user Page
advise after for method validateUser
INFO 2017-10-03 13:33:15,294 [http-nio-8080-exec-6] - com.framework.aspect.FrameworkLoggingAspect : After Name validateUser
INFO 2017-10-03 13:33:15,294 [http-nio-8080-exec-6] - com.framework.aspect.FrameworkLoggingAspect : After Modifier 1
but in this controller(UserManagerController) advise not applying
INFO 2017-10-03 13:34:18,467 [http-nio-8080-exec-9] - com.framework.controller.UserManagerController : Inside User View Page
Please help me with this, I know this is silly question and already have lot of tutorial posted for that, but believe me I already go throw it but still I cant understand whats go wrong ?
The methods in UserManagerController are package-visible. They might need to be public (depending on your Spring version). For CGLib, Spring 3.2.18 recommends public method signatures, whereas Spring 5 can intercept public and protected methods (and, according to the note in the documentation, "even package-visible methods if necessary").