You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/08/09 13:24:48 UTC

[camel] branch master updated (075f3a2 -> 1a5f8b2)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git.


    from 075f3a2  Remove link to twitter-streaming-component
     new a429059  CAMEL-13846: Make PropertyBindingSupport a fluent builder only
     new 1a5f8b2  CAMEL-13792: Fixed issue with camel-rest-swagger and renaming http components and some flaws with settign up rest configuration

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../camel/component/http4/HttpComponent.java       |   8 +-
 .../component/netty4/http/NettyHttpComponent.java  |   9 +-
 .../camel/component/rest/RestApiEndpoint.java      |   9 +-
 .../apache/camel/component/rest/RestEndpoint.java  |   8 +-
 .../component/undertow/UndertowComponent.java      |   9 +-
 .../cloud/ServiceCallExpressionConfiguration.java  |   2 +-
 .../ServiceCallServiceChooserConfiguration.java    |   2 +-
 .../ServiceCallServiceDiscoveryConfiguration.java  |   2 +-
 .../ServiceCallServiceFilterConfiguration.java     |   2 +-
 ...erviceCallServiceLoadBalancerConfiguration.java |   2 +-
 .../camel/reifier/rest/RestBindingReifier.java     |   2 +-
 ...opertyBindingSupportAutowireNestedDeepTest.java |   2 +-
 .../PropertyBindingSupportAutowireNestedTest.java  |  10 +-
 .../PropertyBindingSupportAutowireTest.java        |   2 +-
 .../support/PropertyBindingSupportListTest.java    |   8 +-
 .../support/PropertyBindingSupportMapTest.java     |   8 +-
 .../camel/support/PropertyBindingSupportTest.java  | 111 +++++----
 .../java/org/apache/camel/main/MainSupport.java    |  10 +-
 .../management/JmxManagementStrategyFactory.java   |   2 +-
 .../DefaultComponentVerifierExtension.java         |   2 +-
 .../org/apache/camel/support/DefaultComponent.java |   2 +-
 .../org/apache/camel/support/DefaultEndpoint.java  |   2 +-
 .../org/apache/camel/support/EndpointHelper.java   |   2 +-
 .../camel/support/PropertyBindingSupport.java      | 257 +++++++++++----------
 .../camel/support/RestProducerFactoryHelper.java   |   6 +-
 .../camel/support/ScheduledPollConsumer.java       |   4 +-
 .../support/component/AbstractApiComponent.java    |   2 +-
 27 files changed, 271 insertions(+), 214 deletions(-)


[camel] 02/02: CAMEL-13792: Fixed issue with camel-rest-swagger and renaming http components and some flaws with settign up rest configuration

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 1a5f8b26fccfe578e3d7029bde2c7ac1c0e1aa01
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Aug 9 15:15:16 2019 +0200

    CAMEL-13792: Fixed issue with camel-rest-swagger and renaming http components and some flaws with settign up rest configuration
---
 .../java/org/apache/camel/component/http4/HttpComponent.java     | 8 +++++++-
 .../apache/camel/component/netty4/http/NettyHttpComponent.java   | 9 ++++++---
 .../java/org/apache/camel/component/rest/RestApiEndpoint.java    | 9 +++++++--
 .../main/java/org/apache/camel/component/rest/RestEndpoint.java  | 8 +++++++-
 .../org/apache/camel/component/undertow/UndertowComponent.java   | 9 ++++++---
 5 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http4/HttpComponent.java b/components/camel-http/src/main/java/org/apache/camel/component/http4/HttpComponent.java
index ab4ec4d..2c90ba9 100644
--- a/components/camel-http/src/main/java/org/apache/camel/component/http4/HttpComponent.java
+++ b/components/camel-http/src/main/java/org/apache/camel/component/http4/HttpComponent.java
@@ -432,7 +432,13 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa
 
         RestConfiguration config = configuration;
         if (config == null) {
-            config = camelContext.getRestConfiguration("http", true);
+            config = camelContext.getRestConfiguration("http", false);
+            if (config == null) {
+                camelContext.getRestConfiguration();
+            }
+            if (config == null) {
+                config = camelContext.getRestConfiguration("http", true);
+            }
         }
 
         Map<String, Object> map = new HashMap<>();
diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
index 8eadd9f..af59ab2 100644
--- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
+++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
@@ -440,10 +440,13 @@ public class NettyHttpComponent extends NettyComponent implements HeaderFilterSt
         if (!ObjectHelper.isEmpty(uriTemplate)) {
             url += "/" + uriTemplate;
         }
-        
-        RestConfiguration config = configuration;
+
+        RestConfiguration config = getCamelContext().getRestConfiguration("netty-http", false);
         if (config == null) {
-            config = camelContext.getRestConfiguration("netty-http", true);
+            config = getCamelContext().getRestConfiguration();
+        }
+        if (config == null) {
+            config = getCamelContext().getRestConfiguration("netty-http", true);
         }
 
         Map<String, Object> map = new HashMap<>();
diff --git a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
index b393aa7..69bc559 100644
--- a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
+++ b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
@@ -24,7 +24,6 @@ import org.apache.camel.Component;
 import org.apache.camel.Consumer;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.ExtendedCamelContext;
-import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
@@ -134,7 +133,13 @@ public class RestApiEndpoint extends DefaultEndpoint {
     public Producer createProducer() throws Exception {
         RestApiProcessorFactory factory = null;
 
-        RestConfiguration config = getCamelContext().getRestConfiguration(consumerComponentName, true);
+        RestConfiguration config = getCamelContext().getRestConfiguration(consumerComponentName, false);
+        if (config == null) {
+            config = getCamelContext().getRestConfiguration();
+        }
+        if (config == null) {
+            config = getCamelContext().getRestConfiguration(consumerComponentName, true);
+        }
 
         // lookup in registry
         Set<RestApiProcessorFactory> factories = getCamelContext().getRegistry().findByType(RestApiProcessorFactory.class);
diff --git a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
index f2aab6f..4658f4b 100644
--- a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
+++ b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
@@ -378,7 +378,13 @@ public class RestEndpoint extends DefaultEndpoint {
         if (factory != null) {
             log.debug("Using RestProducerFactory: {}", factory);
 
-            RestConfiguration config = getCamelContext().getRestConfiguration(pname, true);
+            RestConfiguration config = getCamelContext().getRestConfiguration(pname, false);
+            if (config == null) {
+                config = getCamelContext().getRestConfiguration();
+            }
+            if (config == null) {
+                config = getCamelContext().getRestConfiguration(pname, true);
+            }
 
             Producer producer;
             if (apiDocFactory != null) {
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
index 2b5a5bc..57f9ec4 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
@@ -275,10 +275,13 @@ public class UndertowComponent extends DefaultComponent implements RestConsumerF
         if (!ObjectHelper.isEmpty(uriTemplate)) {
             url += "/" + uriTemplate;
         }
-        
-        RestConfiguration config = configuration;
+
+        RestConfiguration config = getCamelContext().getRestConfiguration(getComponentName(), false);
         if (config == null) {
-            config = camelContext.getRestConfiguration(getComponentName(), true);
+            config = getCamelContext().getRestConfiguration();
+        }
+        if (config == null) {
+            config = getCamelContext().getRestConfiguration(getComponentName(), true);
         }
 
         Map<String, Object> map = new HashMap<>();


[camel] 01/02: CAMEL-13846: Make PropertyBindingSupport a fluent builder only

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit a429059dc66be64631d3702e57349ad286faeec9
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Aug 9 15:14:47 2019 +0200

    CAMEL-13846: Make PropertyBindingSupport a fluent builder only
---
 .../cloud/ServiceCallExpressionConfiguration.java  |   2 +-
 .../ServiceCallServiceChooserConfiguration.java    |   2 +-
 .../ServiceCallServiceDiscoveryConfiguration.java  |   2 +-
 .../ServiceCallServiceFilterConfiguration.java     |   2 +-
 ...erviceCallServiceLoadBalancerConfiguration.java |   2 +-
 .../camel/reifier/rest/RestBindingReifier.java     |   2 +-
 ...opertyBindingSupportAutowireNestedDeepTest.java |   2 +-
 .../PropertyBindingSupportAutowireNestedTest.java  |  10 +-
 .../PropertyBindingSupportAutowireTest.java        |   2 +-
 .../support/PropertyBindingSupportListTest.java    |   8 +-
 .../support/PropertyBindingSupportMapTest.java     |   8 +-
 .../camel/support/PropertyBindingSupportTest.java  | 111 +++++----
 .../java/org/apache/camel/main/MainSupport.java    |  10 +-
 .../management/JmxManagementStrategyFactory.java   |   2 +-
 .../DefaultComponentVerifierExtension.java         |   2 +-
 .../org/apache/camel/support/DefaultComponent.java |   2 +-
 .../org/apache/camel/support/DefaultEndpoint.java  |   2 +-
 .../org/apache/camel/support/EndpointHelper.java   |   2 +-
 .../camel/support/PropertyBindingSupport.java      | 257 +++++++++++----------
 .../camel/support/RestProducerFactoryHelper.java   |   6 +-
 .../camel/support/ScheduledPollConsumer.java       |   4 +-
 .../support/component/AbstractApiComponent.java    |   2 +-
 22 files changed, 238 insertions(+), 204 deletions(-)

diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
index 61ef0d1..131766d 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
@@ -268,7 +268,7 @@ public class ServiceCallExpressionConfiguration extends IdentifiedType implement
 
                     postProcessFactoryParameters(camelContext, parameters);
 
-                    PropertyBindingSupport.bindProperties(camelContext, factory, parameters);
+                    PropertyBindingSupport.build().bind(camelContext, factory, parameters);
 
                     answer = factory.newInstance(camelContext);
                 } catch (Exception e) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
index 5b2c2d5..4366890 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
@@ -186,7 +186,7 @@ public class ServiceCallServiceChooserConfiguration extends IdentifiedType imple
 
                 postProcessFactoryParameters(camelContext, parameters);
 
-                PropertyBindingSupport.bindProperties(camelContext, factory, parameters);
+                PropertyBindingSupport.build().bind(camelContext, factory, parameters);
 
                 answer = factory.newInstance(camelContext);
             } catch (Exception e) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
index 3203420..81524ac 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
@@ -193,7 +193,7 @@ public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType imp
 
                 postProcessFactoryParameters(camelContext, parameters);
 
-                PropertyBindingSupport.bindProperties(camelContext, factory, parameters);
+                PropertyBindingSupport.build().bind(camelContext, factory, parameters);
 
                 answer = factory.newInstance(camelContext);
             } catch (Exception e) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
index cb14348..5a4c3dc 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
@@ -186,7 +186,7 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
 
                 postProcessFactoryParameters(camelContext, parameters);
 
-                PropertyBindingSupport.bindProperties(camelContext, factory, parameters);
+                PropertyBindingSupport.build().bind(camelContext, factory, parameters);
 
                 answer = factory.newInstance(camelContext);
             } catch (Exception e) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
index d31fecbb..07f7c23 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
@@ -186,7 +186,7 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
 
                 postProcessFactoryParameters(camelContext, parameters);
 
-                PropertyBindingSupport.bindProperties(camelContext, factory, parameters);
+                PropertyBindingSupport.build().bind(camelContext, factory, parameters);
 
                 answer = factory.newInstance(camelContext);
             } catch (Exception e) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
index 04928f0..2110edf 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
@@ -199,7 +199,7 @@ public class RestBindingReifier {
                 }
             }
 
-            PropertyBindingSupport.bindProperties(context, dataFormat, copy);
+            PropertyBindingSupport.build().bind(context, dataFormat, copy);
         }
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireNestedDeepTest.java b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireNestedDeepTest.java
index 5c706fe..79a5233 100644
--- a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireNestedDeepTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireNestedDeepTest.java
@@ -41,7 +41,7 @@ public class PropertyBindingSupportAutowireNestedDeepTest extends ContextTestSup
     public void testAutowirePropertiesDeep() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
         // use deep nesting
         PropertyBindingSupport.autowireSingletonPropertiesFromRegistry(context, foo, false, true, null);
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireNestedTest.java b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireNestedTest.java
index 84ab322..d958404 100644
--- a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireNestedTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireNestedTest.java
@@ -41,11 +41,11 @@ public class PropertyBindingSupportAutowireNestedTest extends ContextTestSupport
     public void testAutowireProperties() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.age", "33");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.rider", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.gold-customer", "true");
-        PropertyBindingSupport.autowireSingletonPropertiesFromRegistry(context, foo);
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "bar.age", "33");
+        PropertyBindingSupport.build().bind(context, foo, "bar.rider", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.gold-customer", "true");
+        PropertyBindingSupport.autowireSingletonPropertiesFromRegistry(context, foo, false, false, null);
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
diff --git a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireTest.java b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireTest.java
index 5b33d61..2e7aa85 100644
--- a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportAutowireTest.java
@@ -42,7 +42,7 @@ public class PropertyBindingSupportAutowireTest extends ContextTestSupport {
     public void testAutowireProperties() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
         PropertyBindingSupport.autowireSingletonPropertiesFromRegistry(context, foo);
 
         assertEquals("James", foo.getName());
diff --git a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportListTest.java b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportListTest.java
index 5579c64..8f9d3c87 100644
--- a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportListTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportListTest.java
@@ -64,7 +64,7 @@ public class PropertyBindingSupportListTest extends ContextTestSupport {
         prop.put("bar.works[0]", "#bean:company1");
         prop.put("bar.works[1]", "#bean:company2");
 
-        PropertyBindingSupport.bindProperties(context, foo, prop);
+        PropertyBindingSupport.build().bind(context, foo, prop);
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -91,7 +91,7 @@ public class PropertyBindingSupportListTest extends ContextTestSupport {
         prop.put("bar.works[1]", "#bean:company2");
         prop.put("bar.works[1].name", "I changed this");
 
-        PropertyBindingSupport.bindProperties(context, foo, prop);
+        PropertyBindingSupport.build().bind(context, foo, prop);
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -114,7 +114,7 @@ public class PropertyBindingSupportListTest extends ContextTestSupport {
         prop.put("works[1]", "#bean:company2");
         prop.put("works[1].name", "I changed this");
 
-        PropertyBindingSupport.bindProperties(context, bar, prop);
+        PropertyBindingSupport.build().bind(context, bar, prop);
 
         assertEquals(2, bar.getWorks().size());
         assertEquals(666, bar.getWorks().get(0).getId());
@@ -133,7 +133,7 @@ public class PropertyBindingSupportListTest extends ContextTestSupport {
         prop.put("bar.gold-customer[]", "true");
 
         try {
-            PropertyBindingSupport.bindProperties(context, foo, prop);
+            PropertyBindingSupport.build().bind(context, foo, prop);
             fail("Should have thrown exception");
         } catch (PropertyBindingException e) {
             assertEquals("bar.gold-customer[]", e.getPropertyName());
diff --git a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportMapTest.java b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportMapTest.java
index 0acaa24..4586887 100644
--- a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportMapTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportMapTest.java
@@ -63,7 +63,7 @@ public class PropertyBindingSupportMapTest extends ContextTestSupport {
         prop.put("bar.works[acme]", "#bean:company1");
         prop.put("bar.works[burger]", "#bean:company2");
 
-        PropertyBindingSupport.bindProperties(context, foo, prop);
+        PropertyBindingSupport.build().bind(context, foo, prop);
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -90,7 +90,7 @@ public class PropertyBindingSupportMapTest extends ContextTestSupport {
         prop.put("bar.works[burger]", "#bean:company2");
         prop.put("bar.works[burger].name", "I changed this");
 
-        PropertyBindingSupport.bindProperties(context, foo, prop);
+        PropertyBindingSupport.build().bind(context, foo, prop);
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -113,7 +113,7 @@ public class PropertyBindingSupportMapTest extends ContextTestSupport {
         prop.put("works[burger]", "#bean:company2");
         prop.put("works[burger].name", "I changed this");
 
-        PropertyBindingSupport.bindProperties(context, bar, prop);
+        PropertyBindingSupport.build().bind(context, bar, prop);
 
         assertEquals(2, bar.getWorks().size());
         assertEquals(666, bar.getWorks().get("acme").getId());
@@ -132,7 +132,7 @@ public class PropertyBindingSupportMapTest extends ContextTestSupport {
         prop.put("bar.gold-customer[foo]", "true");
 
         try {
-            PropertyBindingSupport.bindProperties(context, foo, prop);
+            PropertyBindingSupport.build().bind(context, foo, prop);
             fail("Should have thrown exception");
         } catch (PropertyBindingException e) {
             assertEquals("bar.gold-customer[foo]", e.getPropertyName());
diff --git a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java
index 968961f..a417ccd 100644
--- a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java
@@ -73,6 +73,35 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     }
 
     @Test
+    public void testWithFluentBuilder() throws Exception {
+        Foo foo = new Foo();
+
+        Map<String, Object> prop = new HashMap<>();
+        prop.put("bar.age", "33");
+        prop.put("bar.{{committer}}", "true");
+        prop.put("bar.gold-customer", "true");
+        prop.put("bar.work.name", "{{companyName}}");
+
+        PropertyBindingSupport.build()
+                .withCamelContext(context)
+                .withTarget(foo)
+                .withProperty("name", "James")
+                .withProperty("bar.work.id", "123")
+                // and add the rest
+                .withProperties(prop)
+                .bind();
+
+        assertEquals("James", foo.getName());
+        assertEquals(33, foo.getBar().getAge());
+        assertTrue(foo.getBar().isRider());
+        assertTrue(foo.getBar().isGoldCustomer());
+        assertEquals(123, foo.getBar().getWork().getId());
+        assertEquals("Acme", foo.getBar().getWork().getName());
+
+        assertTrue("Should bind all properties", prop.isEmpty());
+    }
+
+    @Test
     public void testPropertiesIgnoreCase() throws Exception {
         Foo foo = new Foo();
 
@@ -84,7 +113,7 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
         prop.put("bAr.work.ID", "123");
         prop.put("bar.WORk.naME", "{{companyName}}");
 
-        PropertyBindingSupport.bindProperties(context, foo, prop, true);
+        PropertyBindingSupport.build().withIgnoreCase(true).bind(context, foo, prop);
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -109,7 +138,7 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
         prop.put("my.prefix.bar.work.name", "{{companyName}}");
         prop.put("my.other.prefix.something", "test");
 
-        PropertyBindingSupport.bindProperties(context, foo, prop, "my.prefix.");
+        PropertyBindingSupport.build().withOptionPrefix("my.prefix.").bind(context, foo, prop);
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -134,7 +163,7 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
         prop.put("my.prEFIx.bar.Work.Name", "{{companyName}}");
         prop.put("my.other.prefix.something", "test");
 
-        PropertyBindingSupport.bindProperties(context, foo, prop, "my.prefix.", true);
+        PropertyBindingSupport.build().withOptionPrefix("my.prefix.").withIgnoreCase(true).bind(context, foo, prop);
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -150,12 +179,12 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     public void testNested() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.age", "33");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.{{committer}}", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.gold-customer", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.work.id", "123");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.work.name", "{{companyName}}");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "bar.age", "33");
+        PropertyBindingSupport.build().bind(context, foo, "bar.{{committer}}", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.gold-customer", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.work.id", "123");
+        PropertyBindingSupport.build().bind(context, foo, "bar.work.name", "{{companyName}}");
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -169,11 +198,11 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     public void testNestedReference() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.age", "33");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.gold-customer", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.rider", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.work", "#bean:myWork");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "bar.age", "33");
+        PropertyBindingSupport.build().bind(context, foo, "bar.gold-customer", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.rider", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.work", "#bean:myWork");
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -187,11 +216,11 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     public void testNestedReferenceId() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.age", "33");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.gold-customer", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.rider", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.work", "#bean:myWork");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "bar.age", "33");
+        PropertyBindingSupport.build().bind(context, foo, "bar.gold-customer", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.rider", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.work", "#bean:myWork");
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -205,11 +234,11 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     public void testNestedType() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.age", "33");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.{{committer}}", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.gold-customer", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.work", "#type:org.apache.camel.support.Company");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "bar.age", "33");
+        PropertyBindingSupport.build().bind(context, foo, "bar.{{committer}}", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.gold-customer", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.work", "#type:org.apache.camel.support.Company");
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -223,11 +252,11 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     public void testNestedClass() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.age", "33");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.{{committer}}", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.gold-customer", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.work", "#class:org.apache.camel.support.Company");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "bar.age", "33");
+        PropertyBindingSupport.build().bind(context, foo, "bar.{{committer}}", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.gold-customer", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.work", "#class:org.apache.camel.support.Company");
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -242,11 +271,11 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     public void testAutowired() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.age", "33");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.{{committer}}", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.gold-customer", "true");
-        PropertyBindingSupport.bindProperty(context, foo, "bar.work", "#autowired");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "bar.age", "33");
+        PropertyBindingSupport.build().bind(context, foo, "bar.{{committer}}", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.gold-customer", "true");
+        PropertyBindingSupport.build().bind(context, foo, "bar.work", "#autowired");
 
         assertEquals("James", foo.getName());
         assertEquals(33, foo.getBar().getAge());
@@ -260,13 +289,13 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     public void testMandatory() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindMandatoryProperty(context, foo, "name", "James");
+        PropertyBindingSupport.build().withMandatory(true).bind(context, foo, "name", "James");
 
-        boolean bound = PropertyBindingSupport.bindProperty(context, foo, "bar.myAge", "33");
+        boolean bound = PropertyBindingSupport.build().bind(context, foo, "bar.myAge", "33");
         assertFalse(bound);
 
         try {
-            PropertyBindingSupport.bindMandatoryProperty(context, foo, "bar.myAge", "33");
+            PropertyBindingSupport.build().withMandatory(true).bind(context, foo, "bar.myAge", "33");
             fail("Should have thrown exception");
         } catch (PropertyBindingException e) {
             assertEquals("bar.myAge", e.getPropertyName());
@@ -278,9 +307,9 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
     public void testDoesNotExistClass() throws Exception {
         Foo foo = new Foo();
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
         try {
-            PropertyBindingSupport.bindProperty(context, foo, "bar.work", "#class:org.apache.camel.support.DoesNotExist");
+            PropertyBindingSupport.build().bind(context, foo, "bar.work", "#class:org.apache.camel.support.DoesNotExist");
             fail("Should throw exception");
         } catch (PropertyBindingException e) {
             assertIsInstanceOf(ClassNotFoundException.class, e.getCause());
@@ -313,9 +342,9 @@ public class PropertyBindingSupportTest extends ContextTestSupport {
             }
         });
 
-        PropertyBindingSupport.bindProperty(context, foo, "name", "James");
+        PropertyBindingSupport.build().bind(context, foo, "name", "James");
         try {
-            PropertyBindingSupport.bindProperty(context, foo, "bar.work", "#class:org.apache.camel.support.Company");
+            PropertyBindingSupport.build().bind(context, foo, "bar.work", "#class:org.apache.camel.support.Company");
             fail("Should throw exception");
         } catch (PropertyBindingException e) {
             assertIsInstanceOf(IllegalStateException.class, e.getCause());
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java
index 1f1e6be..9d32d7d 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java
@@ -804,7 +804,7 @@ public abstract class MainSupport extends ServiceSupport {
         if (envEnabled == null) {
             envEnabled = prop.remove("camel.main.auto-configuration-environment-variables-enabled");
             if (envEnabled != null) {
-                PropertyBindingSupport.bindMandatoryProperty(camelContext, mainConfigurationProperties, "autoConfigurationEnvironmentVariablesEnabled", envEnabled, true);
+                PropertyBindingSupport.build().withMandatory(true).withIgnoreCase(true).bind(camelContext, mainConfigurationProperties, "autoConfigurationEnvironmentVariablesEnabled", envEnabled);
                 autoConfiguredProperties.put("camel.main.auto-configuration-environment-variables-enabled", envEnabled.toString());
             }
         }
@@ -825,14 +825,14 @@ public abstract class MainSupport extends ServiceSupport {
         // special for fail-fast as we need to know this early before we set all the other options
         Object failFast = propENV != null ? propENV.remove("camel.main.autoconfigurationfailfast") : null;
         if (failFast != null) {
-            PropertyBindingSupport.bindMandatoryProperty(camelContext, mainConfigurationProperties, "autoConfigurationFailFast", failFast, true);
+            PropertyBindingSupport.build().withMandatory(true).withIgnoreCase(true).bind(camelContext, mainConfigurationProperties, "autoConfigurationFailFast", failFast);
         } else {
             failFast = prop.remove("camel.main.autoConfigurationFailFast");
             if (failFast == null) {
                 failFast = prop.remove("camel.main.auto-configuration-fail-fast");
             }
             if (failFast != null) {
-                PropertyBindingSupport.bindMandatoryProperty(camelContext, mainConfigurationProperties, "autoConfigurationFailFast", failFast, true);
+                PropertyBindingSupport.build().withMandatory(true).withIgnoreCase(true).bind(camelContext, mainConfigurationProperties, "autoConfigurationFailFast", failFast);
                 autoConfiguredProperties.put("camel.main.auto-configuration-fail-fast", failFast.toString());
             }
         }
@@ -1262,10 +1262,10 @@ public abstract class MainSupport extends ServiceSupport {
             try {
                 boolean hit;
                 if (failIfNotSet) {
-                    PropertyBindingSupport.bindMandatoryProperty(context, target, name, stringValue, ignoreCase);
+                    PropertyBindingSupport.build().withMandatory(true).withIgnoreCase(ignoreCase).bind(context, target, name, stringValue);
                     hit = true;
                 } else {
-                    hit = PropertyBindingSupport.bindProperty(context, target, name, stringValue, ignoreCase);
+                    hit = PropertyBindingSupport.build().withIgnoreCase(true).bind(context, target, name, stringValue);
                 }
                 if (hit) {
                     it.remove();
diff --git a/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java b/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
index 63b00c0..fbabb31 100644
--- a/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
+++ b/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
@@ -33,7 +33,7 @@ public class JmxManagementStrategyFactory implements ManagementStrategyFactory {
     public ManagementStrategy create(CamelContext context, Map<String, Object> options) throws Exception {
         DefaultManagementAgent agent = new DefaultManagementAgent(context);
         if (options != null) {
-            PropertyBindingSupport.bindProperties(context, agent, options);
+            PropertyBindingSupport.build().bind(context, agent, options);
         }
 
         return new JmxManagementStrategy(context, agent);
diff --git a/core/camel-support/src/main/java/org/apache/camel/component/extension/verifier/DefaultComponentVerifierExtension.java b/core/camel-support/src/main/java/org/apache/camel/component/extension/verifier/DefaultComponentVerifierExtension.java
index c473b77..148111c 100644
--- a/core/camel-support/src/main/java/org/apache/camel/component/extension/verifier/DefaultComponentVerifierExtension.java
+++ b/core/camel-support/src/main/java/org/apache/camel/component/extension/verifier/DefaultComponentVerifierExtension.java
@@ -187,7 +187,7 @@ public class DefaultComponentVerifierExtension implements ComponentVerifierExten
         }
 
         if (!properties.isEmpty()) {
-            PropertyBindingSupport.bindProperties(camelContext, instance, properties);
+            PropertyBindingSupport.build().bind(camelContext, instance, properties);
         }
 
         return instance;
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java
index 0229404..ce0f8a8 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java
@@ -398,7 +398,7 @@ public abstract class DefaultComponent extends ServiceSupport implements Compone
                     .bind(camelContext, bean, parameters);
         } else {
             // use advanced binding
-            PropertyBindingSupport.bindProperties(camelContext, bean, parameters);
+            PropertyBindingSupport.build().bind(camelContext, bean, parameters);
         }
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultEndpoint.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultEndpoint.java
index 6d572c0..a57354f 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultEndpoint.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultEndpoint.java
@@ -416,7 +416,7 @@ public abstract class DefaultEndpoint extends ServiceSupport implements Endpoint
                     .bind(camelContext, bean, parameters);
         } else {
             // use advanced binding
-            PropertyBindingSupport.bindProperties(camelContext, bean, parameters);
+            PropertyBindingSupport.build().bind(camelContext, bean, parameters);
         }
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
index f4b973c..b72a4fb 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
@@ -157,7 +157,7 @@ public final class EndpointHelper {
     @Deprecated
     public static void setProperties(CamelContext context, Object bean, Map<String, Object> parameters) throws Exception {
         // use the property binding which can do more advanced configuration
-        PropertyBindingSupport.bindProperties(context, bean, parameters);
+        PropertyBindingSupport.build().bind(context, bean, parameters);
     }
 
     /**
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 310042f..eec9564 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
@@ -17,6 +17,7 @@
 package org.apache.camel.support;
 
 import java.lang.reflect.Method;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -59,6 +60,13 @@ public final class PropertyBindingSupport {
      */
     public static class Builder {
 
+        // TODO: add fluent for camel context, target, properties map, property key/value
+
+        private CamelContext camelContext;
+        private Object target;
+        private Map<String, Object> properties;
+        private boolean removeParameters = true;
+        private boolean mandatory;
         private boolean nesting = true;
         private boolean deepNesting = true;
         private boolean reference = true;
@@ -69,6 +77,64 @@ public final class PropertyBindingSupport {
         private String optionPrefix;
 
         /**
+         * CamelContext to be used
+         */
+        public Builder withCamelContext(CamelContext camelContext) {
+            this.camelContext = camelContext;
+            return this;
+        }
+
+        /**
+         * Target object that should have parameters bound
+         */
+        public Builder withTarget(Object target) {
+            this.target = target;
+            return this;
+        }
+
+        /**
+         * The properties to use for binding
+         */
+        public Builder withProperties(Map<String, Object> properties) {
+            if (this.properties == null) {
+                this.properties = properties;
+            } else {
+                // there may be existing options so add those if missing
+                // we need to mutate existing as we are may be removing bound properties
+                this.properties.forEach(properties::putIfAbsent);
+                this.properties = properties;
+            }
+            return this;
+        }
+
+        /**
+         * Adds property to use for binding
+         */
+        public Builder withProperty(String key, Object value) {
+            if (this.properties == null) {
+                this.properties = new LinkedHashMap<>();
+            }
+            this.properties.put(key, value);
+            return this;
+        }
+
+        /**
+         * Whether parameters should be removed when its bound
+         */
+        public Builder withRemoteParameters(boolean removeParameters) {
+            this.removeParameters = removeParameters;
+            return this;
+        }
+
+        /**
+         * Whether all parameters should be mandatory and successfully bound
+         */
+        public Builder withMandatory(boolean mandatory) {
+            this.mandatory = mandatory;
+            return this;
+        }
+
+        /**
          * Whether nesting is in use
          */
         public Builder withNesting(boolean nesting) {
@@ -138,18 +204,60 @@ public final class PropertyBindingSupport {
         /**
          * Binds the properties to the target object, and removes the property that was bound from properties.
          *
+         * @return  true if one or more properties was bound
+         */
+        public boolean bind() {
+            // mandatory parameters
+            org.apache.camel.util.ObjectHelper.notNull(camelContext, "camelContext");
+            org.apache.camel.util.ObjectHelper.notNull(target, "target");
+            org.apache.camel.util.ObjectHelper.notNull(properties, "properties");
+
+            return doBindProperties(camelContext, target, properties, optionPrefix, ignoreCase, removeParameters, mandatory,
+                    nesting, deepNesting, fluentBuilder, allowPrivateSetter, reference, placeholder);
+        }
+
+        /**
+         * Binds the properties to the target object, and removes the property that was bound from properties.
+         *
          * @param camelContext  the camel context
          * @param target        the target object
          * @param properties    the properties where the bound properties will be removed from
          * @return              true if one or more properties was bound
          */
         public boolean bind(CamelContext camelContext, Object target, Map<String, Object> properties) {
+            CamelContext context = camelContext != null ? camelContext : this.camelContext;
+            Object obj = target != null ? target : this.target;
+            Map<String, Object> prop = properties != null ? properties : this.properties;
+
+            // mandatory parameters
+            org.apache.camel.util.ObjectHelper.notNull(context, "camelContext");
+            org.apache.camel.util.ObjectHelper.notNull(obj, "target");
+            org.apache.camel.util.ObjectHelper.notNull(prop, "properties");
+
+            return doBindProperties(context, obj, prop, optionPrefix, ignoreCase, removeParameters, mandatory,
+                    nesting, deepNesting, fluentBuilder, allowPrivateSetter, reference, placeholder);
+        }
+
+        /**
+         * Binds the property to the target object.
+         *
+         * @param camelContext  the camel context
+         * @param target        the target object
+         * @param key           the property key
+         * @param value         the property value
+         * @return              true if the property was bound
+         */
+        public boolean bind(CamelContext camelContext, Object target, String key, Object value) {
             org.apache.camel.util.ObjectHelper.notNull(camelContext, "camelContext");
             org.apache.camel.util.ObjectHelper.notNull(target, "target");
-            org.apache.camel.util.ObjectHelper.notNull(properties, "properties");
+            org.apache.camel.util.ObjectHelper.notNull(key, "key");
+            org.apache.camel.util.ObjectHelper.notNull(value, "value");
+
+            Map<String, Object> properties = Collections.singletonMap(key, value);
 
-            return bindProperties(camelContext, target, properties, optionPrefix, ignoreCase, nesting, deepNesting,
-                    fluentBuilder, allowPrivateSetter, reference, placeholder);
+            // do not remove parameters as this is a single property
+            return doBindProperties(camelContext, target, properties, optionPrefix, ignoreCase, false, mandatory,
+                    nesting, deepNesting, fluentBuilder, allowPrivateSetter, reference, placeholder);
         }
 
     }
@@ -287,56 +395,25 @@ public final class PropertyBindingSupport {
 
     /**
      * Binds the properties to the target object, and removes the property that was bound from properties.
+     * <p/>
+     * This method uses the default settings, and if you need to configure any setting then use
+     * the fluent builder {@link #build()} where each option can be customized, such as whether parameter
+     * should be removed, or whether options are mandatory etc.
      *
      * @param camelContext  the camel context
      * @param target        the target object
      * @param properties    the properties where the bound properties will be removed from
      * @return              true if one or more properties was bound
-     */
-    public static boolean bindProperties(CamelContext camelContext, Object target, Map<String, Object> properties) {
-        return bindProperties(camelContext, target, properties, null);
-    }
-
-    /**
-     * Binds the properties to the target object, and removes the property that was bound from properties.
      *
-     * @param camelContext  the camel context
-     * @param target        the target object
-     * @param properties    the properties where the bound properties will be removed from
-     * @param ignoreCase    whether to ignore case for property keys
-     * @return              true if one or more properties was bound
+     * @see #build()
      */
-    public static boolean bindProperties(CamelContext camelContext, Object target, Map<String, Object> properties, boolean ignoreCase) {
-        return bindProperties(camelContext, target, properties, null, ignoreCase, true, true, true, true, true, true);
-    }
+    public static boolean bindProperties(CamelContext camelContext, Object target, Map<String, Object> properties) {
+        // mandatory parameters
+        org.apache.camel.util.ObjectHelper.notNull(camelContext, "camelContext");
+        org.apache.camel.util.ObjectHelper.notNull(target, "target");
+        org.apache.camel.util.ObjectHelper.notNull(properties, "properties");
 
-    /**
-     * Binds the properties with the given prefix to the target object, and removes the property that was bound from properties.
-     * Note that the prefix is removed from the key before the property is bound.
-     *
-     * @param camelContext  the camel context
-     * @param target        the target object
-     * @param properties    the properties where the bound properties will be removed from
-     * @param optionPrefix  the prefix used to filter properties
-     * @return              true if one or more properties was bound
-     */
-    public static boolean bindProperties(CamelContext camelContext, Object target, Map<String, Object> properties, String optionPrefix) {
-        return bindProperties(camelContext, target, properties, optionPrefix, false);
-    }
-
-    /**
-     * Binds the properties with the given prefix to the target object, and removes the property that was bound from properties.
-     * Note that the prefix is removed from the key before the property is bound.
-     *
-     * @param camelContext  the camel context
-     * @param target        the target object
-     * @param properties    the properties where the bound properties will be removed from
-     * @param optionPrefix  the prefix used to filter properties
-     * @param ignoreCase    whether to ignore case for property keys
-     * @return              true if one or more properties was bound
-     */
-    public static boolean bindProperties(CamelContext camelContext, Object target, Map<String, Object> properties, String optionPrefix, boolean ignoreCase) {
-        return bindProperties(camelContext, target, properties, optionPrefix, ignoreCase, true, true, true, true, true, true);
+        return PropertyBindingSupport.build().bind(camelContext, target, properties);
     }
 
     /**
@@ -348,6 +425,8 @@ public final class PropertyBindingSupport {
      * @param properties          the properties where the bound properties will be removed from
      * @param optionPrefix        the prefix used to filter properties
      * @param ignoreCase          whether to ignore case for property keys
+     * @param removeParameter     whether to remove bound parameters
+     * @param madatory            whether all parameters must be bound
      * @param nesting             whether nesting is in use
      * @param deepNesting         whether deep nesting is in use, where Camel will attempt to walk as deep as possible by creating new objects in the OGNL graph if
      *                            a property has a setter and the object can be created from a default no-arg constructor.
@@ -357,10 +436,10 @@ public final class PropertyBindingSupport {
      * @param placeholder         whether to use Camels property placeholder to resolve placeholders on keys and values
      * @return                    true if one or more properties was bound
      */
-    public static boolean bindProperties(CamelContext camelContext, Object target, Map<String, Object> properties,
-                                         String optionPrefix, boolean ignoreCase,
-                                         boolean nesting, boolean deepNesting, boolean fluentBuilder, boolean allowPrivateSetter,
-                                         boolean reference, boolean placeholder) {
+    private static boolean doBindProperties(CamelContext camelContext, Object target, Map<String, Object> properties,
+                                            String optionPrefix, boolean ignoreCase, boolean removeParameter, boolean madatory,
+                                            boolean nesting, boolean deepNesting, boolean fluentBuilder, boolean allowPrivateSetter,
+                                            boolean reference, boolean placeholder) {
         org.apache.camel.util.ObjectHelper.notNull(camelContext, "camelContext");
         org.apache.camel.util.ObjectHelper.notNull(target, "target");
         org.apache.camel.util.ObjectHelper.notNull(properties, "properties");
@@ -387,50 +466,17 @@ public final class PropertyBindingSupport {
                 key = key.substring(optionPrefix.length());
             }
 
-            if (bindProperty(camelContext, target, key, value, ignoreCase, nesting, deepNesting, fluentBuilder, allowPrivateSetter, reference, placeholder)) {
+            boolean bound = bindProperty(camelContext, target, key, value, ignoreCase, nesting, deepNesting, fluentBuilder, allowPrivateSetter, reference, placeholder);
+            if (bound && removeParameter) {
                 iter.remove();
                 rc = true;
             }
-        }
-
-        return rc;
-    }
-
-    /**
-     * Binds the property to the target object.
-     *
-     * @param camelContext  the camel context
-     * @param target        the target object
-     * @param name          name of property
-     * @param value         value of property
-     * @return              true if property was bound, false otherwise
-     * @throws PropertyBindingException is thrown if error binding property
-     */
-    public static boolean bindProperty(CamelContext camelContext, Object target, String name, Object value) throws PropertyBindingException {
-        return bindProperty(camelContext, target, name, value, false);
-    }
-
-    /**
-     * Binds the property to the target object.
-     *
-     * @param camelContext  the camel context
-     * @param target        the target object
-     * @param name          name of property
-     * @param value         value of property
-     * @param ignoreCase    whether to ignore case for property keys
-     * @return              true if property was bound, false otherwise
-     * @throws PropertyBindingException is thrown if error binding property
-     */
-    public static boolean bindProperty(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) throws PropertyBindingException {
-        try {
-            if (target != null && name != null) {
-                return setProperty(camelContext, target, name, value, false, ignoreCase, true, true, true, true, true, true);
+            if (madatory && !bound) {
+                throw new PropertyBindingException(target, key, value);
             }
-        } catch (Exception e) {
-            throw new PropertyBindingException(target, name, value, e);
         }
 
-        return false;
+        return rc;
     }
 
     private static boolean bindProperty(CamelContext camelContext, Object target, String name, Object value,
@@ -447,43 +493,6 @@ public final class PropertyBindingSupport {
         return false;
     }
 
-    /**
-     * Binds the mandatory property to the target object (will fail if not set/bound).
-     *
-     * @param camelContext  the camel context
-     * @param target        the target object
-     * @param name          name of property
-     * @param value         value of property
-     * @throws PropertyBindingException is thrown if error binding property, or the property was not bound
-     */
-    public static void bindMandatoryProperty(CamelContext camelContext, Object target, String name, Object value) throws PropertyBindingException {
-        bindMandatoryProperty(camelContext, target, name, value, false);
-    }
-
-    /**
-     * Binds the mandatory property to the target object (will fail if not set/bound).
-     *
-     * @param camelContext  the camel context
-     * @param target        the target object
-     * @param name          name of property
-     * @param value         value of property
-     * @param ignoreCase    whether to ignore case for property keys
-     * @throws PropertyBindingException is thrown if error binding property, or the property was not bound
-     */
-    public static void bindMandatoryProperty(CamelContext camelContext, Object target, String name, Object value, boolean ignoreCase) throws PropertyBindingException {
-        boolean bound;
-        if (target != null && name != null) {
-            try {
-                bound = setProperty(camelContext, target, name, value, true, ignoreCase, true, true, true, true, true, true);
-            } catch (Exception e) {
-                throw new PropertyBindingException(target, name, value, e);
-            }
-            if (!bound) {
-                throw new PropertyBindingException(target, name, value);
-            }
-        }
-    }
-
     private static boolean setProperty(CamelContext context, Object target, String name, Object value, boolean mandatory,
                                        boolean ignoreCase, boolean nesting, boolean deepNesting, boolean fluentBuilder,
                                        boolean allowPrivateSetter, boolean reference, boolean placeholder) throws Exception {
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/RestProducerFactoryHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/RestProducerFactoryHelper.java
index c3f8f94..7aa1135 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/RestProducerFactoryHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/RestProducerFactoryHelper.java
@@ -75,11 +75,7 @@ public final class RestProducerFactoryHelper {
 
         // component was not added to the context we can configure it
         final Component newlyCreated = camelContext.getComponent(componentName, true, false);
-        // need to make a copy of the component properties as
-        // IntrospectionSupport::setProperties will remove any that are set and
-        // we might be called multiple times
-        final Map<String, Object> copyOfComponentProperties = new LinkedHashMap<>(componentProperties);
-        PropertyBindingSupport.bindProperties(camelContext, newlyCreated, copyOfComponentProperties);
+        PropertyBindingSupport.build().withRemoteParameters(false).bind(camelContext, newlyCreated, componentProperties);
         ServiceHelper.startService(newlyCreated);
 
         return newlyCreated;
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java b/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java
index c816fc9..c620048 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumer.java
@@ -420,11 +420,11 @@ public abstract class ScheduledPollConsumer extends DefaultConsumer implements R
         // configure scheduler with options from this consumer
         Map<String, Object> properties = new LinkedHashMap<>();
         IntrospectionSupport.getProperties(this, properties, null);
-        PropertyBindingSupport.bindProperties(getEndpoint().getCamelContext(), scheduler, properties);
+        PropertyBindingSupport.build().bind(getEndpoint().getCamelContext(), scheduler, properties);
         if (schedulerProperties != null && !schedulerProperties.isEmpty()) {
             // need to use a copy in case the consumer is restarted so we keep the properties
             Map<String, Object> copy = new LinkedHashMap<>(schedulerProperties);
-            PropertyBindingSupport.bindProperties(getEndpoint().getCamelContext(), scheduler, copy);
+            PropertyBindingSupport.build().bind(getEndpoint().getCamelContext(), scheduler, copy);
             if (copy.size() > 0) {
                 throw new FailedToCreateConsumerException(getEndpoint(), "There are " + copy.size()
                         + " scheduler parameters that couldn't be set on the endpoint."
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiComponent.java b/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiComponent.java
index c5ddd02..ad68368 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiComponent.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/component/AbstractApiComponent.java
@@ -113,7 +113,7 @@ public abstract class AbstractApiComponent<E extends Enum<E> & ApiName, T, S ext
 
         // create endpoint configuration with component properties
         final T endpointConfiguration = collection.getEndpointConfiguration(name);
-        PropertyBindingSupport.bindProperties(getCamelContext(), endpointConfiguration, componentProperties);
+        PropertyBindingSupport.build().bind(getCamelContext(), endpointConfiguration, componentProperties);
         return endpointConfiguration;
     }