This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-3.14.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit 69886f48ab66a0ff8721e6427b528bea82558d92 Author: Claus Ibsen <[email protected]> AuthorDate: Wed Jan 12 16:19:39 2022 +0100 CAMEL-17479: configuring beans with {{?foo}} supported. --- .../OptionalPropertyPlaceholderBeanTest.java | 5 ----- .../apache/camel/support/PropertyBindingSupport.java | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/component/properties/OptionalPropertyPlaceholderBeanTest.java b/core/camel-core/src/test/java/org/apache/camel/component/properties/OptionalPropertyPlaceholderBeanTest.java index f388097..c281670 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/properties/OptionalPropertyPlaceholderBeanTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/properties/OptionalPropertyPlaceholderBeanTest.java @@ -20,7 +20,6 @@ import org.apache.camel.CamelContext; import org.apache.camel.ContextTestSupport; import org.apache.camel.component.pojo.SayService; import org.apache.camel.support.PropertyBindingSupport; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -38,20 +37,17 @@ public class OptionalPropertyPlaceholderBeanTest extends ContextTestSupport { assertEquals("Hello", say.getMessage()); PropertyBindingSupport.build().withTarget(say).withProperty("message", "{{?cool.name}}") - .withMandatory(false) .withCamelContext(context) .bind(); assertEquals("Camel", say.getMessage()); } @Test - @Disabled("TODO: https://issues.apache.org/jira/browse/CAMEL-17479") public void testQueryOptionalNotPresent() throws Exception { SayService say = new SayService(); assertEquals("Hello", say.getMessage()); PropertyBindingSupport.build().withTarget(say).withProperty("message", "{{?unknown}}") - .withMandatory(false) .withCamelContext(context) .bind(); assertEquals("Hello", say.getMessage()); @@ -63,7 +59,6 @@ public class OptionalPropertyPlaceholderBeanTest extends ContextTestSupport { assertEquals("Hello", say.getMessage()); PropertyBindingSupport.build().withTarget(say).withProperty("message", "{{?unknown:Bye}}") - .withMandatory(false) .withCamelContext(context) .bind(); assertEquals("Bye", say.getMessage()); diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java index ee379b9..789b13a 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java @@ -38,6 +38,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.ExtendedCamelContext; import org.apache.camel.PropertyBindingException; import org.apache.camel.spi.BeanIntrospection; +import org.apache.camel.spi.PropertiesComponent; import org.apache.camel.spi.PropertyConfigurer; import org.apache.camel.spi.PropertyConfigurerGetter; import org.apache.camel.util.StringHelper; @@ -84,6 +85,17 @@ import static org.apache.camel.util.StringHelper.startsWithIgnoreCase; * </pre> * <p> * Where foo is mandatory, and bar is optional. + * + * <p> + * Values can be marked as optional property placeholder if the values name starts with a question mark, such as: + * + * <pre> + * username={{?clientUserName}} + * </pre> + * <p> + * Where the username property will only be set if the property placeholder <tt>clientUserName</tt> exists, otherwise + * the username is not affected. + * </p> */ public final class PropertyBindingSupport { @@ -420,7 +432,12 @@ public final class PropertyBindingSupport { key = camelContext.resolvePropertyPlaceholders(key); if (text instanceof String) { // resolve property placeholders - text = camelContext.resolvePropertyPlaceholders(text.toString()); + String s = text.toString(); + text = camelContext.resolvePropertyPlaceholders(s); + if (text == null && s.startsWith(PropertiesComponent.PREFIX_TOKEN + "?")) { + // it was an optional value, so we should not try to set the property but regard it as a "hit" + return true; + } } }
