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 中的请求范围组件)