From e4fd1ad5d12c0b899e80e02201978adc36503f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20S=C3=A1nchez?= Date: Fri, 13 Feb 2026 10:51:09 +0100 Subject: [PATCH 1/2] Fix bean definition conflicts in transactional engine configuration - Remove @Primary from sagaObjectMapper to prevent conflict with eventsourcing's @Primary ObjectMapper when both are on classpath - Remove redundant simple tccEvents bean that prevented the composite TccEvents from being created due to @ConditionalOnMissingBean ordering - Remove @ConditionalOnMissingBean from tccEventsComposite so the composite pattern is always active (consistent with sagaEventsComposite) - Add @ConditionalOnMissingBean to webClientBuilder to avoid conflict with Spring Boot's auto-configured WebClient.Builder --- .../saga/config/SagaPersistenceAutoConfiguration.java | 2 -- .../shared/config/TransactionalEngineConfiguration.java | 8 +------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/org/fireflyframework/transactional/saga/config/SagaPersistenceAutoConfiguration.java b/src/main/java/org/fireflyframework/transactional/saga/config/SagaPersistenceAutoConfiguration.java index d71724b..e93fcf2 100644 --- a/src/main/java/org/fireflyframework/transactional/saga/config/SagaPersistenceAutoConfiguration.java +++ b/src/main/java/org/fireflyframework/transactional/saga/config/SagaPersistenceAutoConfiguration.java @@ -33,7 +33,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; /** * Auto-configuration for Saga persistence capabilities. @@ -64,7 +63,6 @@ public class SagaPersistenceAutoConfiguration { */ @Bean @ConditionalOnMissingBean - @Primary public ObjectMapper sagaObjectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.findAndRegisterModules(); // This will register JSR310 module for Java 8 time types diff --git a/src/main/java/org/fireflyframework/transactional/shared/config/TransactionalEngineConfiguration.java b/src/main/java/org/fireflyframework/transactional/shared/config/TransactionalEngineConfiguration.java index a6f923c..9061c71 100644 --- a/src/main/java/org/fireflyframework/transactional/shared/config/TransactionalEngineConfiguration.java +++ b/src/main/java/org/fireflyframework/transactional/shared/config/TransactionalEngineConfiguration.java @@ -142,12 +142,6 @@ public SagaEngine sagaEngine(SagaRegistry registry, ); } - @Bean - @ConditionalOnMissingBean - public TccEvents tccEvents(LoggingTransactionalObserver loggingObserver) { - return new TccToGenericObserverAdapter(loggingObserver); - } - @Bean @ConditionalOnMissingBean public TccEventPublisher tccEventPublisher() { @@ -263,7 +257,6 @@ public SagaEvents sagaEventsComposite(ApplicationContext applicationContext, @Bean @Primary - @ConditionalOnMissingBean(TccEvents.class) public TccEvents tccEventsComposite(LoggingTransactionalObserver logger, ObjectProvider micrometer, ObjectProvider tracing) { @@ -333,6 +326,7 @@ public TccCompositor tccCompositor(TccEngine tccEngine, TccRegistry tccRegistry, } @Bean + @ConditionalOnMissingBean public WebClient.Builder webClientBuilder() { return WebClient.builder(); } From 102f91b0d110e8013792ca78973371dc1e1a90fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20S=C3=A1nchez?= Date: Fri, 13 Feb 2026 11:30:08 +0100 Subject: [PATCH 2/2] Fix dual @Primary conflict on TccEvents composite bean Make tccEventsComposite aggregate all TccEvents beans from the ApplicationContext (consistent with sagaEventsComposite pattern). This allows test and custom TccEvents beans to be collected by the composite without requiring @Primary, preventing the dual-primary conflict that caused build failures. --- .../config/TransactionalEngineConfiguration.java | 12 +++++++++++- .../tcc/it/TccEngineIntegrationTest.java | 2 -- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/fireflyframework/transactional/shared/config/TransactionalEngineConfiguration.java b/src/main/java/org/fireflyframework/transactional/shared/config/TransactionalEngineConfiguration.java index 9061c71..c839661 100644 --- a/src/main/java/org/fireflyframework/transactional/shared/config/TransactionalEngineConfiguration.java +++ b/src/main/java/org/fireflyframework/transactional/shared/config/TransactionalEngineConfiguration.java @@ -257,11 +257,21 @@ public SagaEvents sagaEventsComposite(ApplicationContext applicationContext, @Bean @Primary - public TccEvents tccEventsComposite(LoggingTransactionalObserver logger, + public TccEvents tccEventsComposite(ApplicationContext applicationContext, + LoggingTransactionalObserver logger, ObjectProvider micrometer, ObjectProvider tracing) { List sinks = new ArrayList<>(); + // Add all other TccEvents beans first (including test beans) + // Exclude the composite itself to avoid circular dependency + Map allEvents = applicationContext.getBeansOfType(TccEvents.class); + for (Map.Entry entry : allEvents.entrySet()) { + if (!"tccEventsComposite".equals(entry.getKey())) { + sinks.add(entry.getValue()); + } + } + // Add logging adapter sinks.add(new TccToGenericObserverAdapter(logger)); diff --git a/src/test/java/org/fireflyframework/transactional/tcc/it/TccEngineIntegrationTest.java b/src/test/java/org/fireflyframework/transactional/tcc/it/TccEngineIntegrationTest.java index 8e20257..3c508cd 100644 --- a/src/test/java/org/fireflyframework/transactional/tcc/it/TccEngineIntegrationTest.java +++ b/src/test/java/org/fireflyframework/transactional/tcc/it/TccEngineIntegrationTest.java @@ -29,7 +29,6 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -67,7 +66,6 @@ public FailingTcc failingTcc() { } @Bean - @Primary public TccEvents testEvents() { return new TestEvents(); }