【问题标题】:Spring AOP Advise not work for all controller, work for one controller onlySpring AOP 建议不适用于所有控制器,仅适用于一个控制器
【发布时间】:2017-10-03 08:13:06
【问题描述】:

在下面找到我创建的代码。

我想记录(AOP Advice before,after etc.)所有控制器方法, 但建议只应用一个控制器(AuthenticationController)方法,在第二个控制器(UserManagerController)上建议不应用,两个控制器都在同一个包中(com.framework.controller),但我不知道出了什么问题?为什么它只适用于一个控制器而不是其他控制器。


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>

找到我的 Aspect 课程 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());
}}

查找控制器包(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);
}}

在下面找到我得到的输出

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

请帮我解决这个问题,我知道这是个愚蠢的问题,并且已经为此发布了很多教程,但相信我,我已经把它扔了,但我还是不明白出了什么问题?

【问题讨论】:

    标签: java spring aop


    【解决方案1】:

    UserManagerController 中的方法是包可见的。它们可能需要公开(取决于您的 Spring 版本)。对于 CGLib,Spring 3.2.18 建议使用公共方法签名,而 Spring 5 可以拦截公共和受保护方法(并且,根据note in the documentation,“必要时甚至可以使用包可见的方法”)。

    【讨论】:

      猜你喜欢
      • 2018-01-14
      • 2017-04-05
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多