Java 方面中的会话作用域bean
我无法将会话范围的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
@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完美地结合在一起