From 831f7512f2b2d002762958423af5ff5d7be945f6 Mon Sep 17 00:00:00 2001 From: Timon Borter Date: Thu, 21 May 2026 16:32:20 +0200 Subject: [PATCH] feat(#1531)!: change default custom validator mode from EXCLUSIVE to COMBINED When a custom validator is provided, it previously ran exclusively, silently bypassing all other validation. This means any other constraints passed to `validate()` was simply ignored. This BREAKING CHANGE changes the default custom validator mode from `EXCLUSIVE` to `COMBINED`, so that custom validators run alongside other validation rather than replacing it. Users who genuinely need the old exclusive behaviour can still opt in explicitly, but the footgun default is gone. BREAKING CHANGE: Change default custom validator mode from `EXCLUSIVE` to `COMBINED`. --- .../src/main/java/org/citrusframework/CitrusSettings.java | 2 +- .../src/test/java/org/citrusframework/CitrusSettingsTest.java | 4 ++-- .../org/citrusframework/actions/ReceiveMessageActionTest.java | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/citrus-api/src/main/java/org/citrusframework/CitrusSettings.java b/core/citrus-api/src/main/java/org/citrusframework/CitrusSettings.java index 307a60bf43..d5b7c0e824 100644 --- a/core/citrus-api/src/main/java/org/citrusframework/CitrusSettings.java +++ b/core/citrus-api/src/main/java/org/citrusframework/CitrusSettings.java @@ -272,7 +272,7 @@ private CitrusSettings() { public static final String CUSTOM_VALIDATOR_STRATEGY_PROPERTY = "citrus.custom.validator.strategy"; public static final String CUSTOM_VALIDATOR_STRATEGY_ENV = "CITRUS_CUSTOM_VALIDATOR_STRATEGY"; - public static final CustomValidatorStrategy CUSTOM_VALIDATOR_STRATEGY_DEFAULT = CustomValidatorStrategy.EXCLUSIVE; + public static final CustomValidatorStrategy CUSTOM_VALIDATOR_STRATEGY_DEFAULT = CustomValidatorStrategy.COMBINED; /** * Flag to enable/disable input stream caching diff --git a/core/citrus-api/src/test/java/org/citrusframework/CitrusSettingsTest.java b/core/citrus-api/src/test/java/org/citrusframework/CitrusSettingsTest.java index 8e40a3729d..e6ef923543 100644 --- a/core/citrus-api/src/test/java/org/citrusframework/CitrusSettingsTest.java +++ b/core/citrus-api/src/test/java/org/citrusframework/CitrusSettingsTest.java @@ -56,12 +56,12 @@ public void isStackTraceOutputEnabled_shouldReturnPropertyValue_overEnvVarValue( } @Test - public void getCustomValidatorStrategy_shouldReturnExclusiveByDefault() { + public void getCustomValidatorStrategy_shouldReturnCombinedByDefault() { systemProperties.remove(CUSTOM_VALIDATOR_STRATEGY_PROPERTY); environmentVariables.remove(CUSTOM_VALIDATOR_STRATEGY_ENV); assertThat(CitrusSettings.getCustomValidatorStrategy()) - .isEqualTo(EXCLUSIVE); + .isEqualTo(COMBINED); } @DataProvider diff --git a/core/citrus-base/src/test/java/org/citrusframework/actions/ReceiveMessageActionTest.java b/core/citrus-base/src/test/java/org/citrusframework/actions/ReceiveMessageActionTest.java index d39dc33e3b..f98c4d05a6 100644 --- a/core/citrus-base/src/test/java/org/citrusframework/actions/ReceiveMessageActionTest.java +++ b/core/citrus-base/src/test/java/org/citrusframework/actions/ReceiveMessageActionTest.java @@ -1232,6 +1232,8 @@ public void testReceiveMessage_shouldInvokeValidationContexts_whenNoCustomValida """ ) public void testReceiveMessage_shouldIgnoreValidationContexts_whenCustomValidatorIsPresent_andValidationStrategyIsExclusive() { + environmentVariables.set(CUSTOM_VALIDATOR_STRATEGY_ENV, "EXCLUSIVE"); + var testActor = new TestActor(); testActor.setName("TESTACTOR");