Java 方面中的会话作用域bean

Java 方面中的会话作用域bean,java,spring,aop,aspect,Java,Spring,Aop,Aspect,我无法将会话范围的bean自动连接到方面 我的外貌是这样的: @Aspect public class AuditAspect { Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private AuditService auditService; @Autowired private SessionData sessionData; @AfterReturni

我无法将会话范围的bean自动连接到方面

我的外貌是这样的:

@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);
      }

   }

}
@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;
   }
}
event.getServletContext().addListener(new RequestContextListener());
我的SessionData bean是会话范围的,如下所示:

@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);
      }

   }

}
@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;
   }
}
event.getServletContext().addListener(new RequestContextListener());
在方面中,AuditService在OK中自动连接,SessionData不为null,但它会抛出一个异常,如

Method threw 'org.springframework.beans.factory.BeanCreationException' exception. Cannot evaluate se.reforce.fasthi.core.infrastructure.SessionData$$EnhancerBySpringCGLIB$$26c0d5bb.toString()
我添加了一个ContextLoaderListener来公开请求,如下所示:

@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);
      }

   }

}
@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;
   }
}
event.getServletContext().addListener(new RequestContextListener());
在SessionData bean中自动连接作为其他singelton bean中的代理,效果很好,但问题出现在方面

我错过了什么

多谢各位
/约翰头痛了几天后,我发现了这个问题。问题是我的Vaadin积分(我忘了在我的问题中提到)。我的vaadinui上的@Push注释对servlet造成了混淆,因此spring无法识别会话范围的bean。我解决了这个问题,将注释更改为:

@Push(transport= Transport.WEBSOCKET_XHR)

就是这样,现在会话范围的bean与singelton bean完美地结合在一起

我在头痛了几天后发现了问题。问题是我的Vaadin积分(我忘了在我的问题中提到)。我的vaadinui上的@Push注释对servlet造成了混淆,因此spring无法识别会话范围的bean。我解决了这个问题,将注释更改为:

@Push(transport= Transport.WEBSOCKET_XHR)
就是这样,现在会话范围的bean与singelton bean完美地结合在一起