我有问题自动装配会话范围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中的代理自动装配,但问题出现在方面
我错过了什么?
谢谢 /约翰
答案 0 :(得分:0)
我在头痛几天后发现了这个问题。问题是我的Vaadin整合(我忘记在我的问题中提到)。我的vaadin UI上的@Push注释做了一些与servlet混淆的事情,因此spring无法识别会话范围的bean。我解决了这个问题,我将注释更改为:
@Push(transport= Transport.WEBSOCKET_XHR)
就是这样,现在会话范围内的bean与singelton bean完美配合