Aspect

时间:2016-06-14 13:43:26

标签: java spring aop aspect

我有问题自动装配会话范围bean到Aspect。

我的方面如下:

@Aspect
public class AuditAspect {

   Logger logger = LoggerFactory.getLogger(this.getClass());

   @Autowired
   private AuditService auditService;

   @Autowired
   private SessionData sessionData;


   @AfterReturning(value = "@annotation(fasthiAudit) && execution(* *(..))")
   public void audit(JoinPoint joinPoint, FasthiAudit fasthiAudit) {
      final String className = joinPoint.getTarget().getClass().getName();
      final String methodName = joinPoint.getSignature().getName();

      try {

         UserId userId = sessionData.getUserId();
         TenantId tenantId = sessionData.getTenantId();

      } catch (Exception e) {
         logger.error("Could not log audit entry for method name: " + methodName + " in class " + className, e);
      }

   }

}

我的SessionData bean是会话范围的,如下所示:

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionData {

   private UserId userId;
   private TenantId tenantId;

   public UserId getUserId() {
      return userId;
   }

   public void setUserId(UserId userId) {
      this.userId = userId;
   }

   public TenantId getTenantId() {
      return tenantId;
   }

   public void setTenantId(TenantId tenantId) {
      this.tenantId = tenantId;
   }
}

在这个方面,AuditService是自动装配好的,而SessionData不是null但它会引发像

这样的异常
Method threw 'org.springframework.beans.factory.BeanCreationException' exception. Cannot evaluate se.reforce.fasthi.core.infrastructure.SessionData$$EnhancerBySpringCGLIB$$26c0d5bb.toString()

我添加了一个ContextLoaderListener来公开请求,如下所示:

event.getServletContext().addListener(new RequestContextListener());

它可以在SessionData bean中作为其他singelton bean中的代理自动装配,但问题出现在方面

我错过了什么?

谢谢 /约翰

1 个答案:

答案 0 :(得分:0)

我在头痛几天后发现了这个问题。问题是我的Vaadin整合(我忘记在我的问题中提到)。我的vaadin UI上的@Push注释做了一些与servlet混淆的事情,因此spring无法识别会话范围的bean。我解决了这个问题,我将注释更改为:

@Push(transport= Transport.WEBSOCKET_XHR)

就是这样,现在会话范围内的bean与singelton bean完美配合