Spring, @Aspect, @AfterThrowing, ответ на пустой экран - PullRequest
0 голосов
/ 25 февраля 2011
  1. У меня есть aspectjrt-1.5.4.jar, aspectjweaver-1.6.1.jar, org.springframework.aop-3.0.5.RELEASE.jar в моем пути к классам приложений.

  2. My applicationContext.xml содержит

    <aop:aspectj-autoproxy/>
    <bean id="loggerAspect" class="com.company.logging.LoggerAspect" />
    
  3. Мой LoggerAspect.java содержит

    @Aspect
    public class LoggerAspect
    {
    
        @Before("execution( * com.company..*(..)) and !execution( * com.company.*.action..*(..))")
        public void logEntry(JoinPoint joinPoint)
        {
            Logger logger = Logger.getLogger(joinPoint.getTarget().getClass());
            String className = joinPoint.getTarget().getClass().getCanonicalName();
            logger.debug(className + " :: " + joinPoint.getSignature().getName() + " :: " + "Entry");
        }
    
        @AfterReturning("execution( * com.company..*(..)) and !execution( * com.company.*.action..*(..))")
        public void logExit(JoinPoint joinPoint)
        {
            Logger logger = Logger.getLogger(joinPoint.getTarget().getClass());
            String className = joinPoint.getTarget().getClass().getCanonicalName();
            logger.debug(className + " :: " + joinPoint.getSignature().getName() + " :: " + "Exit");
        }
    
    
        @AfterThrowing(pointcut = "execution(* com.company..*(..))", throwing = "throwable")
            public void logException(Throwable throwable)
        {
            System.out.println(throwable.getMessage());
        }
    
    }
    
  4. Если я комментируюlogException pointcut, все остальное работает просто отлично.И логи входа и выхода генерируются.Однако, если я раскомментирую его, произойдет следующее исключение.

  5. Я получаю сообщение об ошибке как

java.lang.NullPointerException org.apache.struts2.convention.ConventionUnknownHandler.handleUnknownActionMethod (Конвенции.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly (DefaultActionInvocation.java:291) ru.opensymphony.xwork2.DefaultActionInvocation.invoke (DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept (ParametersInterceptor.java:207) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept (МетодFilterInterceptor.java:98)opensymphony.xwork2.interceptor.com.opensymphony.xwork2.DefaultActionInvocation.invoke (DefaultActionInvocation.java:248) org.apache.struts2.interceptor.CheckboxInterceptor.intercept (CheckboxInterceptor.java:94) com.opensymphony.xwork2.DefaultActionInvocation (по умолчанию) (по умолчанию)com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept (PrepareInterceptor.java:166) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept (MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke (DefaultActionInvocation.java:248) org.apache.struts2.interceptor.ServletConfigInterceptor.intercept (ServletConfigInterceptor.DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept (ExceptionMappingInterceptor.java:187) com.opensymphony.xwork2.DefaultActionInvocation.invoke (DefaultActionInvocation.jimpap.x.st.Proction.x.execute (StrutsActionProxy.java:52) org.apache.struts2.dispatcher.Dispatcher.serviceAction (Dispatcher.java:485) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction (ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter (StrutsPrepareAndExecuteFilter.java:91) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.urity.web.access.intercept.FilterSecurityInterceptor.invoke (FilterSecurityInterceptor.java:109) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter (FilterSecurityInterceptor.java:83)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.access.ExceptionTranslationFilter.doFilter (ExceptionTranslationFilter.java:97) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.session.SessionManagementFilter.doFilter (SessionManagementFilter.java:100) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter (AnonymousAuthenticationFilter.java:78) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter (SecurityContextHolderAwareRequestFilter.java:54) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter (RequestCacheAwareFilter.java:35) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter (BasicAuthenticationFilter.java:177) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter (AbstractAuthenticationProcessingFilter.java:187) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.authentication.logout.LogoutFilter.doFilter (LogoutFilter.java:105) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter (SecurityContextPersistenceFilter.java:79) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.session.ConcurrentSessionFilter.doFilter (ConcurrentSessionFilter.java:109) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380) org.springframework.security.web.FilterChainProxy.doFilter (FilterChainProxy.java:169) org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java:237) org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy.java:167)

6. я сделал следующие изменения

  • Используется aspectjweaver-1.6.10.jar. И удалили две старые банки.
  • Произведено изменение, предложенное Олегом. (что было на самом деле глупой ошибкой с моей стороны). Я обновил метод logException, указанный выше, последними, которые я использую.

Я больше не получаю указанную выше конкретную ошибку. Однако теперь, когда вызывается мое первое действие приложения (home.action), ответом является пустой экран.

Если мой метод logException имеет pointcut = "выполнение (* com.company1 .. (..))" где company1 не является действительным пакетом моего проекта, все работает нормально. Но если у меня есть это как pointcut = "выполнение ( com.company .. * (..))" где компания является действительным пакетом моего проекта, я получаю пустой ответ на каждое действие Struts

Ответы [ 3 ]

1 голос
/ 25 февраля 2011

Возможно, у вас проблема "aspectjrt-1.5.4.jar, aspectjweaver-1.6.1.jar".Помимо того, что они потенциально несовместимы друг с другом, они очень старые версии.Вам следует обновить версию aspectjweaver до версии 1.6.10 и удалить aspectjrt - aspectjweaver уже включает в себя все классы.

0 голосов
/ 26 февраля 2011

Я пытался применить совет к действиям Struts, которые не являются бобами Spring.Я изменил метод, как показано ниже, и он начал работать.

@AfterThrowing(pointcut = "execution( * com.company..*(..)) and !execution( * com.company.*.action..*(..))", throwing = "throwable")
public void logException(JoinPoint joinPoint,Throwable throwable)
{
    Logger logger = Logger.getLogger(joinPoint.getTarget().getClass());
    String className = joinPoint.getTarget().getClass().getCanonicalName();
    logger.error(className + " :: " + joinPoint.getSignature().getName() + " :: " + "Exception", throwable);
}

Имея в виду все вышесказанное, я думаю, всегда ли плохая идея использовать * com.company..*(..).И, скорее, держите его конкретным, применяя к конкретным пакетам, таким как услуги, бизнес, доступ к данным и т. Д.

0 голосов
/ 25 февраля 2011

Насколько я знаю, правильное определение pointcut должно выглядеть следующим образом

@AfterThrowing(pointcut = "execution(* com.company..*(..))", throwing = "exception")
public void logException(Throwable exception)
{
    System.out.println(exception.getMessage());
}

Обратите внимание, что throwing должно содержать имя параметра, который вы привязываете в самом методе ( исключение в данном случае).

Хотя я не понимаю, как это связано с полученным вами исключением, это может быть основной причиной.

...