Aspect 中的会话范围 bean

Posted

技术标签:

【中文标题】Aspect 中的会话范围 bean【英文标题】:Session scoped bean in Aspect 【发布时间】:2016-06-14 13:43:26 【问题描述】:

我在将会话范围的 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);
      

   


我的 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 不为空,但它会引发类似的异常

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】:

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

@Push(transport= Transport.WEBSOCKET_XHR)

就是这样,现在会话范围的 bean 可以与单点 bean 完美地协同工作

【讨论】:

以上是关于Aspect 中的会话范围 bean的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用会话中的属性配置 Spring 会话范围的 bean?

如何在 JSF 中正确使用组件绑定? (会话范围 bean 中的请求范围组件)

带有 AOP 的 Spring 会话范围 bean 中的问题

从JSP文件中的会话范围bean访问数据

在春季将会话范围应用于bean时出错

就序列化而言,Spring 会话范围的 bean(控制器)和对服务的引用