Hello, Would you please recommend one of the below workaround ? Are anyone is running a cas server with two jpa modules (ticket and services) ?
- first workaround : keep the lock disabled : cas.ticket.registry.core.enable-locking - create a custom primary bean in the project to be returned when more than one transaction manager is present - override the ticket and service bean to not use the spring integration bean that calls @ transactional without qualifier. Thank you for your help. Le jeu. 9 nov. 2023 à 00:26, Mohamed Amdouni <[email protected]> a écrit : > Hello, > > Given a cas project with these dependencies : > > implementation "org.apereo.cas:cas-server-support-saml" > implementation "org.apereo.cas:cas-server-support-saml-idp" > implementation "org.apereo.cas:cas-server-support-saml-idp-metadata-jpa" > implementation "org.apereo.cas:cas-server-support-ldap" > implementation "org.apereo.cas:cas-server-support-spnego-webflow" > implementation "org.apereo.cas:cas-server-support-jpa-ticket-registry" > implementation "org.apereo.cas:cas-server-support-jpa-service-registry" > implementation "org.apereo.cas:cas-server-support-jdbc-drivers" > implementation "org.apereo.cas:cas-server-support-rest-authentication" > implementation "org.apereo.cas:cas-server-support-rest" > > When trying to connect a SAML2 client, I encounter the following exception > (only for the first connection) > > org.springframework.webflow.execution.ActionExecutionException: Exception > thrown executing > org.apereo.cas.web.flow.GenerateServiceTicketAction@74af4b0 in state > 'generateServiceTicket' of flow 'login' -- action execution attributes were > 'map[[empty]]' > > at > org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:62) > > at > org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:77) > > at > org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188) > > at > org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51) > > at > org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:101) > > at > org.springframework.webflow.engine.State.enter(State.java:194) > > at > org.springframework.webflow.engine.Transition.execute(Transition.java:228) > > at > org.springframework.webflow.engine.DecisionState.doEnter(DecisionState.java:51) > > at > org.springframework.webflow.engine.State.enter(State.java:194) > > at > org.springframework.webflow.engine.Transition.execute(Transition.java:228) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:395) > > at > org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) > > at > org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:116) > > at > org.springframework.webflow.engine.Flow.handleEvent(Flow.java:547) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:390) > > at > org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) > > at > org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:105) > > at > org.springframework.webflow.engine.State.enter(State.java:194) > > at > org.springframework.webflow.engine.Transition.execute(Transition.java:228) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:395) > > at > org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) > > at > org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:116) > > at > org.springframework.webflow.engine.Flow.handleEvent(Flow.java:547) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:390) > > at > org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) > > at > org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:105) > > at > org.springframework.webflow.engine.State.enter(State.java:194) > > at > org.springframework.webflow.engine.Transition.execute(Transition.java:228) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:395) > > at > org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) > > at > org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:116) > > at > org.springframework.webflow.engine.Flow.handleEvent(Flow.java:547) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:390) > > at > org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) > > at > org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:105) > > at > org.springframework.webflow.engine.State.enter(State.java:194) > > at > org.springframework.webflow.engine.Transition.execute(Transition.java:228) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:395) > > at > org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) > > at > org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:116) > > at > org.springframework.webflow.engine.Flow.handleEvent(Flow.java:547) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:390) > > at > org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) > > at > org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:231) > > at > org.springframework.webflow.engine.ViewState.resume(ViewState.java:195) > > at > org.springframework.webflow.engine.Flow.resume(Flow.java:537) > > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:259) > > at > org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:168) > > at > org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:254) > > at > org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1070) > > at > org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) > > at > org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) > > at > org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) > > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:665) > > at > org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) > > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:750) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:67) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.apereo.cas.web.support.AuthenticationCredentialsThreadLocalBinderClearingFilter.doFilter(AuthenticationCredentialsThreadLocalBinderClearingFilter.java:28) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.apereo.cas.web.support.filters.RequestParameterPolicyEnforcementFilter.doFilter(RequestParameterPolicyEnforcementFilter.java:401) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.apereo.cas.web.support.filters.ResponseHeadersEnforcementFilter.doFilter(ResponseHeadersEnforcementFilter.java:209) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.apereo.cas.web.support.filters.AddResponseHeadersFilter.doFilter(AddResponseHeadersFilter.java:62) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) > > at > org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) > > at > org.springframework.security.web.debug.DebugFilter.invokeWithWrappedRequest(DebugFilter.java:90) > > at > org.springframework.security.web.debug.DebugFilter.doFilter(DebugFilter.java:78) > > at > org.springframework.security.web.debug.DebugFilter.doFilter(DebugFilter.java:67) > > at > org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) > > at > org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) > > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) > > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) > > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.apereo.cas.logging.web.ThreadContextMDCServletFilter.doFilter(ThreadContextMDCServletFilter.java:104) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.apereo.inspektr.common.web.ClientInfoThreadLocalFilter.doFilter(ClientInfoThreadLocalFilter.java:66) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) > > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.springframework.security.web.context.SecurityContextHolderFilter.doFilterInternal(SecurityContextHolderFilter.java:64) > > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) > > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) > > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) > > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) > > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) > > at > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) > > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) > > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) > > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) > > at > org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:670) > > at > org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:765) > > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) > > at > org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) > > at > org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) > > at > org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) > > at > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) > > at > org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) > > at > org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) > > at > org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) > > at > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > > at java.base/java.lang.Thread.run(Thread.java:829) > > Caused by: org.springframework.dao.CannotAcquireLockException: Failed to > lock mutex at 7601b7be-a92f-3e78-b872-9471e27007a3; nested exception is > org.springframework.beans.factory.NoUniqueBeanDefinitionException: No > qualifying bean of type > 'org.springframework.transaction.TransactionManager' available: expected > single matching bean but found 2: > ticketTransactionManager,transactionManagerServiceReg > > at > org.springframework.integration.jdbc.lock.JdbcLockRegistry$JdbcLock.rethrowAsLockException(JdbcLockRegistry.java:197) > > at > org.springframework.integration.jdbc.lock.JdbcLockRegistry$JdbcLock.tryLock(JdbcLockRegistry.java:262) > > at > org.apereo.cas.util.lock.DefaultLockRepository.lambda$execute$1(DefaultLockRepository.java:28) > > at > org.jooq.lambda.Unchecked.lambda$supplier$38(Unchecked.java:1695) > > at > org.apereo.cas.util.lock.DefaultLockRepository.execute(DefaultLockRepository.java:38) > > at > org.apereo.cas.DefaultCentralAuthenticationService.grantServiceTicket(DefaultCentralAuthenticationService.java:101) > > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native > Method) > > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at > java.base/java.lang.reflect.Method.invoke(Method.java:566) > > at > org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) > > at > org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) > > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) > > at > org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) > > at > org.apereo.inspektr.audit.AuditTrailManagementAspect.handleAuditTrail(AuditTrailManagementAspect.java:178) > > at > jdk.internal.reflect.GeneratedMethodAccessor183.invoke(Unknown Source) > > at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at > java.base/java.lang.reflect.Method.invoke(Method.java:566) > > at > org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634) > > at > org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624) > > at > org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72) > > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) > > at > org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) > > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) > > at > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) > > at com.sun.proxy.$Proxy264.grantServiceTicket(Unknown > Source) > > at > org.apereo.cas.web.flow.GenerateServiceTicketAction.lambda$grantServiceTicket$1(GenerateServiceTicketAction.java:133) > > at > java.base/java.util.Optional.ifPresent(Optional.java:183) > > at > org.apereo.cas.web.flow.GenerateServiceTicketAction.grantServiceTicket(GenerateServiceTicketAction.java:130) > > at > org.apereo.cas.web.flow.GenerateServiceTicketAction.doExecute(GenerateServiceTicketAction.java:105) > > at > org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188) > > at > org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51) > > ... 125 more > > Caused by: > org.springframework.beans.factory.NoUniqueBeanDefinitionException: No > qualifying bean of type > 'org.springframework.transaction.TransactionManager' available: expected > single matching bean but found 2: ticketTransactionManager, > transactionManagerServiceReg > > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1273) > > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:494) > > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:349) > > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342) > > at > org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:503) > > at > org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:342) > > at > org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) > > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) > > at > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) > > at com.sun.proxy.$Proxy263.acquire(Unknown Source) > > at org.springframework.integration.jdbc.lock. > *JdbcLockRegistry$JdbcLock.doLock*(JdbcLockRegistry.java:268) > > at > org.springframework.integration.jdbc.lock.JdbcLockRegistry$JdbcLock.tryLock(JdbcLockRegistry.java:249) > > ... 155 more > > > When looking to the code, the problem is in the bean > declaration > org.apereo.cas.config.JpaTicketRegistryConfiguration.JpaTicketRegistryLockingConfiguration# > jdbcLockRepository > which uses new > org.springframework.integration.jdbc.lock.DefaultLockRepository( > dataSourceTicket)) > > The Spring integration Class DefaultLockRepository uses internally > @*Transactional* without Qualifier. > > So it finds multiple Beans and could not choose one because there is no > @*Primary* bean for transaction Manager. > > As a workaround, I disabled the locking > ("cas.ticket.registry.core.enable-locking") to avoid this exception. > > Would you please check and recommend a final solution when building a CAS > project with two JPA dependencies (ticket and service)? May declare a third > custom PrimaryTransactionManager ? > > I think that there is a similar issue on metadata : nullpointer exception > when getting /idp/metadata if we build a CAS project with two dependencies > > file and jpa metadata. > > @Bean > @RefreshScope(proxyMode = ScopedProxyMode.DEFAULT) > public org.springframework.integration.jdbc.lock.LockRepository > jdbcLockRepository( > final ConfigurableApplicationContext applicationContext, > @Qualifier("dataSourceTicket") > final CloseableDataSource dataSourceTicket) { > return > BeanSupplier.of(org.springframework.integration.jdbc.lock.LockRepository.class) > .when(CONDITION.given(applicationContext.getEnvironment())) > .supply(() -> new > org.springframework.integration.jdbc.lock.DefaultLockRepository(dataSourceTicket)) > .otherwiseProxy() > .get(); > } > > > Best regards. > > -- - Website: https://apereo.github.io/cas - Gitter Chatroom: https://gitter.im/apereo/cas - List Guidelines: https://goo.gl/1VRrw7 - Contributions: https://goo.gl/mh7qDG --- You received this message because you are subscribed to the Google Groups "CAS Community" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/a/apereo.org/d/msgid/cas-user/CALmwvcZCRWpk%3DgEfdoTzpBPT4f0OXDHgkUbv8Np5%3D_Bs35oTRQ%40mail.gmail.com.
