From 086d3c109c766d3508a312d25fcda42d0c2b84c6 Mon Sep 17 00:00:00 2001 From: Teo Sarca Date: Sat, 16 Dec 2017 20:43:32 +0200 Subject: [PATCH] avoid calling other APIs when InternalUserSessionData is initializing https://github.com/metasfresh/metasfresh-webui-api/issues/713 This would fix: Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'scopedTarget.internalUserSessionData': Requested bean is currently in creation: Is there an unresolvable circular reference? at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.getTarget(CglibAopProxy.java:705) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) at de.metas.ui.web.session.InternalUserSessionData$$EnhancerBySpringCGLIB$$52d45398.getCtx() at de.metas.ui.web.session.UserSession.getCtx(UserSession.java:175) at de.metas.ui.web.session.WebRestApiContextProvider.getActualContext(WebRestApiContextProvider.java:104) at de.metas.ui.web.session.WebRestApiContextProvider.access$000(WebRestApiContextProvider.java:44) at de.metas.ui.web.session.WebRestApiContextProvider$1.getDelegate(WebRestApiContextProvider.java:54) at org.adempiere.util.AbstractPropertiesProxy.getProperty(AbstractPropertiesProxy.java:238) at org.compiere.util.Env.getProperty(Env.java:2240) at org.compiere.util.Env.getContext(Env.java:2191) at org.compiere.util.Env.getContext(Env.java:824) at org.compiere.util.Env.getContextAsInt(Env.java:896) at de.metas.logging.SysConfigLoggerCustomizer.customize(SysConfigLoggerCustomizer.java:93) at de.metas.logging.LogManager.getLogger(LogManager.java:32) at de.metas.i18n.ADLanguageList.(ADLanguageList.java:64) ... 134 common frames omitted --- .../web/session/InternalUserSessionData.java | 22 +++++++++++++++---- .../de/metas/ui/web/session/UserSession.java | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/metas/ui/web/session/InternalUserSessionData.java b/src/main/java/de/metas/ui/web/session/InternalUserSessionData.java index 4b15038c4..054cd8251 100644 --- a/src/main/java/de/metas/ui/web/session/InternalUserSessionData.java +++ b/src/main/java/de/metas/ui/web/session/InternalUserSessionData.java @@ -6,7 +6,6 @@ import java.util.Properties; import org.compiere.util.Env; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.ScopedProxyMode; @@ -55,7 +54,7 @@ @Primary @SessionScope(proxyMode = ScopedProxyMode.TARGET_CLASS) @lombok.Data -/* package */ class InternalUserSessionData implements Serializable, InitializingBean +/* package */ class InternalUserSessionData implements Serializable { private static final long serialVersionUID = 4046535476486036184L; @@ -67,6 +66,7 @@ // // Actual session data + private volatile boolean initialized = false; private String sessionId = null; private UserPreference userPreference = null; private boolean loggedIn = false; @@ -114,8 +114,22 @@ public InternalUserSessionData() UserSession.logger.trace("User session created: {}", this); } - @Override - public void afterPropertiesSet() throws Exception + void initializeIfNeeded() + { + if (!initialized) + { + synchronized (this) + { + if (!initialized) + { + initializeNow(); + initialized = true; + } + } + } + } + + private void initializeNow() { // // Set initial properties diff --git a/src/main/java/de/metas/ui/web/session/UserSession.java b/src/main/java/de/metas/ui/web/session/UserSession.java index c6f43ecb2..fb9e5d355 100644 --- a/src/main/java/de/metas/ui/web/session/UserSession.java +++ b/src/main/java/de/metas/ui/web/session/UserSession.java @@ -157,6 +157,7 @@ public UserSession(final ApplicationEventPublisher eventPublisher) private InternalUserSessionData getData() { + _data.initializeIfNeeded(); return _data; }