У меня проблема с автоматическим связыванием компонента с областью действия сеанса в 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);
}
}
}
Мой bean-компонент SessionData ограничен сеансом и выглядит следующим образом:
@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 в качестве прокси-сервера в других компонентах синглтона, но проблема возникает в аспекте
Что мне не хватает?
Спасибо / Йохан