http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentConfiguration.java
 
b/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentConfiguration.java
index c4b186d..702b11b 100644
--- 
a/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentConfiguration.java
+++ 
b/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentConfiguration.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.quickfixj.springboot;
 import java.util.Map;
 import org.apache.camel.component.quickfixj.QuickfixjConfiguration;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 import quickfix.LogFactory;
 import quickfix.MessageFactory;
 import quickfix.MessageStoreFactory;
@@ -35,14 +36,17 @@ public class QuickfixjComponentConfiguration {
     /**
      * To use the given MessageFactory
      */
+    @NestedConfigurationProperty
     private MessageFactory messageFactory;
     /**
      * To use the given LogFactory
      */
+    @NestedConfigurationProperty
     private LogFactory logFactory;
     /**
      * To use the given MessageStoreFactory
      */
+    @NestedConfigurationProperty
     private MessageStoreFactory messageStoreFactory;
     /**
      * To use the given map of pre configured QuickFix configurations mapped to

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentAutoConfiguration.java
 
b/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentAutoConfiguration.java
index ca57cd3..e35c860 100644
--- 
a/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentAutoConfiguration.java
+++ 
b/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentAutoConfiguration.java
@@ -45,6 +45,26 @@ public class RestletComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentConfiguration.java
 
b/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentConfiguration.java
index 612d6af..83f53e3 100644
--- 
a/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentConfiguration.java
+++ 
b/components-starter/camel-restlet-starter/src/main/java/org/apache/camel/component/restlet/springboot/RestletComponentConfiguration.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.restlet.springboot;
 import java.util.List;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * Component for consuming and producing Restful resources using Restlet.
@@ -131,6 +132,7 @@ public class RestletComponentConfiguration {
      * To use a custom HeaderFilterStrategy to filter header to and from Camel
      * message.
      */
+    @NestedConfigurationProperty
     private HeaderFilterStrategy headerFilterStrategy;
 
     public Boolean getControllerDaemon() {

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentAutoConfiguration.java
 
b/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentAutoConfiguration.java
index e73550c..04184fe 100644
--- 
a/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentAutoConfiguration.java
+++ 
b/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentAutoConfiguration.java
@@ -45,6 +45,26 @@ public class SalesforceComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
 
b/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
index d27021a..30b68c5 100644
--- 
a/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
+++ 
b/components-starter/camel-salesforce-starter/src/main/java/org/apache/camel/component/salesforce/springboot/SalesforceComponentConfiguration.java
@@ -19,9 +19,7 @@ package org.apache.camel.component.salesforce.springboot;
 import java.util.Map;
 import java.util.Set;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
 import org.apache.camel.component.salesforce.SalesforceHttpClient;
-import org.apache.camel.component.salesforce.SalesforceLoginConfig;
 import 
org.apache.camel.component.salesforce.api.dto.analytics.reports.ReportMetadata;
 import org.apache.camel.component.salesforce.api.dto.bulk.ContentType;
 import org.apache.camel.component.salesforce.internal.PayloadFormat;
@@ -29,6 +27,7 @@ import 
org.apache.camel.component.salesforce.internal.dto.NotifyForFieldsEnum;
 import 
org.apache.camel.component.salesforce.internal.dto.NotifyForOperationsEnum;
 import org.apache.camel.util.jsse.SSLContextParameters;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * The salesforce component is used for integrating Camel with the massive
@@ -40,15 +39,13 @@ import 
org.springframework.boot.context.properties.ConfigurationProperties;
 public class SalesforceComponentConfiguration {
 
     /**
-     * To use the shared SalesforceLoginConfig as login configuration.
-     * Properties of the shared configuration can also be set individually.
+     * To use the shared SalesforceLoginConfig as login configuration
      */
-    private SalesforceLoginConfig loginConfig;
+    private SalesforceLoginConfigNestedConfiguration loginConfig;
     /**
-     * To use the shared SalesforceEndpointConfig as configuration. Properties
-     * of the shared configuration can also be set individually.
+     * To use the shared SalesforceLoginConfig as configuration
      */
-    private SalesforceEndpointConfig config;
+    private SalesforceEndpointConfigNestedConfiguration config;
     /**
      * Used for configuring HTTP client properties as key/value pairs
      */
@@ -56,6 +53,7 @@ public class SalesforceComponentConfiguration {
     /**
      * To configure security using SSLContextParameters
      */
+    @NestedConfigurationProperty
     private SSLContextParameters sslContextParameters;
     /**
      * To configure HTTP proxy host
@@ -106,193 +104,21 @@ public class SalesforceComponentConfiguration {
      * by comma).
      */
     private String[] packages;
-    /**
-     * Salesforce login URL defaults to https://login.salesforce.com
-     */
-    private String loginUrl;
-    /**
-     * Salesforce connected application Consumer Key
-     */
-    private String clientId;
-    /**
-     * Salesforce connected application Consumer Secret
-     */
-    private String clientSecret;
-    /**
-     * Salesforce account user name
-     */
-    private String userName;
-    /**
-     * Salesforce account password
-     */
-    private String password;
-    /**
-     * Flag to enable/disable lazy OAuth default is false. When enabled OAuth
-     * token retrieval or generation is not done until the first API call
-     */
-    private Boolean lazyLogin;
-    /**
-     * Payload format to use for Salesforce API calls either JSON or XML
-     * defaults to JSON
-     */
-    private PayloadFormat format;
-    /**
-     * Salesforce API version defaults to
-     * SalesforceEndpointConfig.DEFAULT_VERSION
-     */
-    private String apiVersion;
-    /**
-     * SObject name if required or supported by API
-     */
-    private String sObjectName;
-    /**
-     * SObject ID if required by API
-     */
-    private String sObjectId;
-    /**
-     * SObject fields to retrieve
-     */
-    private String sObjectFields;
-    /**
-     * SObject external ID field name
-     */
-    private String sObjectIdName;
-    /**
-     * SObject external ID field value
-     */
-    private String sObjectIdValue;
-    /**
-     * SObject blob field name
-     */
-    private String sObjectBlobFieldName;
-    /**
-     * Fully qualified SObject class name usually generated using
-     * camel-salesforce-maven-plugin
-     */
-    private String sObjectClass;
-    /**
-     * Salesforce SOQL query string
-     */
-    private String sObjectQuery;
-    /**
-     * Salesforce SOSL search string
-     */
-    private String sObjectSearch;
-    /**
-     * APEX method name
-     */
-    private String apexMethod;
-    /**
-     * APEX method URL
-     */
-    private String apexUrl;
-    /**
-     * Query params for APEX method
-     */
-    private Map<String, Object> apexQueryParams;
-    /**
-     * Bulk API content type one of XML CSV ZIP_XML ZIP_CSV
-     */
-    private ContentType contentType;
-    /**
-     * Bulk API Job ID
-     */
-    private String jobId;
-    /**
-     * Bulk API Batch ID
-     */
-    private String batchId;
-    /**
-     * Bulk API Result ID
-     */
-    private String resultId;
-    /**
-     * Whether to update an existing Push Topic when using the Streaming API
-     * defaults to false
-     */
-    private Boolean updateTopic;
-    /**
-     * Notify for fields options are ALL REFERENCED SELECT WHERE
-     */
-    private NotifyForFieldsEnum notifyForFields;
-    /**
-     * Notify for operations options are ALL CREATE EXTENDED UPDATE (API 
version
-     * 29.0)
-     */
-    private NotifyForOperationsEnum notifyForOperations;
-    /**
-     * Notify for create operation defaults to false (API version = 29.0)
-     */
-    private Boolean notifyForOperationCreate;
-    /**
-     * Notify for update operation defaults to false (API version = 29.0)
-     */
-    private Boolean notifyForOperationUpdate;
-    /**
-     * Notify for delete operation defaults to false (API version = 29.0)
-     */
-    private Boolean notifyForOperationDelete;
-    /**
-     * Notify for un-delete operation defaults to false (API version = 29.0)
-     */
-    private Boolean notifyForOperationUndelete;
-    /**
-     * Salesforce1 Analytics report Id
-     */
-    private String reportId;
-    /**
-     * Include details in Salesforce1 Analytics report defaults to false.
-     */
-    private Boolean includeDetails;
-    /**
-     * Salesforce1 Analytics report metadata for filtering
-     */
-    private ReportMetadata reportMetadata;
-    /**
-     * Salesforce1 Analytics report execution instance ID
-     */
-    private String instanceId;
-    /**
-     * Custom Jetty Http Client to use to connect to Salesforce.
-     */
-    private SalesforceHttpClient httpClient;
-    /**
-     * Custom Jackson ObjectMapper to use when serializing/deserializing
-     * Salesforce objects.
-     */
-    private ObjectMapper objectMapper;
-    /**
-     * Default replayId setting if no value is found in link initialReplayIdMap
-     */
-    private Integer defaultReplayId;
-    /**
-     * Replay IDs to start from per channel name.
-     */
-    private Map<String, Integer> initialReplayIdMap;
-    /**
-     * Backoff interval increment for Streaming connection restart attempts for
-     * failures beyond CometD auto-reconnect.
-     */
-    private long backoffIncrement;
-    /**
-     * Maximum backoff interval for Streaming connection restart attempts for
-     * failures beyond CometD auto-reconnect.
-     */
-    private long maxBackoff;
 
-    public SalesforceLoginConfig getLoginConfig() {
+    public SalesforceLoginConfigNestedConfiguration getLoginConfig() {
         return loginConfig;
     }
 
-    public void setLoginConfig(SalesforceLoginConfig loginConfig) {
+    public void setLoginConfig(
+            SalesforceLoginConfigNestedConfiguration loginConfig) {
         this.loginConfig = loginConfig;
     }
 
-    public SalesforceEndpointConfig getConfig() {
+    public SalesforceEndpointConfigNestedConfiguration getConfig() {
         return config;
     }
 
-    public void setConfig(SalesforceEndpointConfig config) {
+    public void setConfig(SalesforceEndpointConfigNestedConfiguration config) {
         this.config = config;
     }
 
@@ -411,332 +237,522 @@ public class SalesforceComponentConfiguration {
         this.packages = packages;
     }
 
-    public String getLoginUrl() {
-        return loginUrl;
-    }
-
-    public void setLoginUrl(String loginUrl) {
-        this.loginUrl = loginUrl;
-    }
-
-    public String getClientId() {
-        return clientId;
-    }
-
-    public void setClientId(String clientId) {
-        this.clientId = clientId;
-    }
-
-    public String getClientSecret() {
-        return clientSecret;
-    }
-
-    public void setClientSecret(String clientSecret) {
-        this.clientSecret = clientSecret;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public Boolean getLazyLogin() {
-        return lazyLogin;
-    }
-
-    public void setLazyLogin(Boolean lazyLogin) {
-        this.lazyLogin = lazyLogin;
-    }
-
-    public PayloadFormat getFormat() {
-        return format;
-    }
-
-    public void setFormat(PayloadFormat format) {
-        this.format = format;
-    }
-
-    public String getApiVersion() {
-        return apiVersion;
-    }
-
-    public void setApiVersion(String apiVersion) {
-        this.apiVersion = apiVersion;
-    }
-
-    public String getSObjectName() {
-        return sObjectName;
-    }
+    public static class SalesforceEndpointConfigNestedConfiguration {
+        public static final Class CAMEL_NESTED_CLASS = 
org.apache.camel.component.salesforce.SalesforceEndpointConfig.class;
+        /**
+         * Payload format to use for Salesforce API calls, either JSON or XML,
+         * defaults to JSON
+         */
+        private PayloadFormat format;
+        /**
+         * Salesforce API version, defaults to
+         * SalesforceEndpointConfig.DEFAULT_VERSION
+         */
+        private String apiVersion;
+        /**
+         * SObject name if required or supported by API
+         */
+        private String sObjectName;
+        /**
+         * SObject ID if required by API
+         */
+        private String sObjectId;
+        /**
+         * SObject fields to retrieve
+         */
+        private String sObjectFields;
+        /**
+         * SObject external ID field name
+         */
+        private String sObjectIdName;
+        /**
+         * SObject external ID field value
+         */
+        private String sObjectIdValue;
+        /**
+         * SObject blob field name
+         */
+        private String sObjectBlobFieldName;
+        /**
+         * Fully qualified SObject class name, usually generated using
+         * camel-salesforce-maven-plugin
+         */
+        private String sObjectClass;
+        /**
+         * Salesforce SOQL query string
+         */
+        private String sObjectQuery;
+        /**
+         * Salesforce SOSL search string
+         */
+        private String sObjectSearch;
+        /**
+         * APEX method name
+         */
+        private String apexMethod;
+        /**
+         * APEX method URL
+         */
+        private String apexUrl;
+        /**
+         * Query params for APEX method
+         */
+        private Map apexQueryParams;
+        /**
+         * Bulk API content type, one of XML, CSV, ZIP_XML, ZIP_CSV
+         */
+        private ContentType contentType;
+        /**
+         * Bulk API Job ID
+         */
+        private String jobId;
+        /**
+         * Bulk API Batch ID
+         */
+        private String batchId;
+        /**
+         * Bulk API Result ID
+         */
+        private String resultId;
+        /**
+         * Whether to update an existing Push Topic when using the Streaming
+         * API, defaults to false
+         */
+        private Boolean updateTopic;
+        /**
+         * Notify for fields, options are ALL, REFERENCED, SELECT, WHERE
+         */
+        private NotifyForFieldsEnum notifyForFields;
+        /**
+         * Notify for operations, options are ALL, CREATE, EXTENDED, UPDATE 
(API
+         * version < 29.0)
+         */
+        private NotifyForOperationsEnum notifyForOperations;
+        /**
+         * Notify for create operation, defaults to false (API version >= 29.0)
+         */
+        private Boolean notifyForOperationCreate;
+        /**
+         * Notify for update operation, defaults to false (API version >= 29.0)
+         */
+        private Boolean notifyForOperationUpdate;
+        /**
+         * Notify for delete operation, defaults to false (API version >= 29.0)
+         */
+        private Boolean notifyForOperationDelete;
+        /**
+         * Notify for un-delete operation, defaults to false (API version >=
+         * 29.0)
+         */
+        private Boolean notifyForOperationUndelete;
+        /**
+         * Salesforce1 Analytics report Id
+         */
+        private String reportId;
+        /**
+         * Include details in Salesforce1 Analytics report, defaults to false.
+         */
+        private Boolean includeDetails;
+        /**
+         * Salesforce1 Analytics report metadata for filtering
+         */
+        @NestedConfigurationProperty
+        private ReportMetadata reportMetadata;
+        /**
+         * Salesforce1 Analytics report execution instance ID
+         */
+        private String instanceId;
+        /**
+         * Custom Jetty Http Client to use to connect to Salesforce.
+         */
+        @NestedConfigurationProperty
+        private SalesforceHttpClient httpClient;
+        /**
+         * Custom Jackson ObjectMapper to use when serializing/deserializing
+         * Salesforce objects.
+         */
+        @NestedConfigurationProperty
+        private ObjectMapper objectMapper;
+        /**
+         * Backoff interval increment for Streaming connection restart attempts
+         * for failures beyond CometD auto-reconnect.
+         */
+        private Long backoffIncrement;
+        /**
+         * Maximum backoff interval for Streaming connection restart attempts
+         * for failures beyond CometD auto-reconnect.
+         */
+        private Long maxBackoff;
+        /**
+         * Default replayId setting if no value is found in
+         * {@link #initialReplayIdMap}
+         * 
+         * @param defaultReplayId
+         */
+        private Integer defaultReplayId;
+        /**
+         * Replay IDs to start from per channel name.
+         */
+        private Map initialReplayIdMap;
+
+        public PayloadFormat getFormat() {
+            return format;
+        }
+
+        public void setFormat(PayloadFormat format) {
+            this.format = format;
+        }
+
+        public String getApiVersion() {
+            return apiVersion;
+        }
+
+        public void setApiVersion(String apiVersion) {
+            this.apiVersion = apiVersion;
+        }
+
+        public String getSObjectName() {
+            return sObjectName;
+        }
+
+        public void setSObjectName(String sObjectName) {
+            this.sObjectName = sObjectName;
+        }
+
+        public String getSObjectId() {
+            return sObjectId;
+        }
+
+        public void setSObjectId(String sObjectId) {
+            this.sObjectId = sObjectId;
+        }
+
+        public String getSObjectFields() {
+            return sObjectFields;
+        }
+
+        public void setSObjectFields(String sObjectFields) {
+            this.sObjectFields = sObjectFields;
+        }
+
+        public String getSObjectIdName() {
+            return sObjectIdName;
+        }
+
+        public void setSObjectIdName(String sObjectIdName) {
+            this.sObjectIdName = sObjectIdName;
+        }
+
+        public String getSObjectIdValue() {
+            return sObjectIdValue;
+        }
+
+        public void setSObjectIdValue(String sObjectIdValue) {
+            this.sObjectIdValue = sObjectIdValue;
+        }
+
+        public String getSObjectBlobFieldName() {
+            return sObjectBlobFieldName;
+        }
+
+        public void setSObjectBlobFieldName(String sObjectBlobFieldName) {
+            this.sObjectBlobFieldName = sObjectBlobFieldName;
+        }
+
+        public String getSObjectClass() {
+            return sObjectClass;
+        }
+
+        public void setSObjectClass(String sObjectClass) {
+            this.sObjectClass = sObjectClass;
+        }
+
+        public String getSObjectQuery() {
+            return sObjectQuery;
+        }
+
+        public void setSObjectQuery(String sObjectQuery) {
+            this.sObjectQuery = sObjectQuery;
+        }
+
+        public String getSObjectSearch() {
+            return sObjectSearch;
+        }
+
+        public void setSObjectSearch(String sObjectSearch) {
+            this.sObjectSearch = sObjectSearch;
+        }
+
+        public String getApexMethod() {
+            return apexMethod;
+        }
+
+        public void setApexMethod(String apexMethod) {
+            this.apexMethod = apexMethod;
+        }
+
+        public String getApexUrl() {
+            return apexUrl;
+        }
 
-    public void setSObjectName(String sObjectName) {
-        this.sObjectName = sObjectName;
-    }
+        public void setApexUrl(String apexUrl) {
+            this.apexUrl = apexUrl;
+        }
 
-    public String getSObjectId() {
-        return sObjectId;
-    }
+        public Map getApexQueryParams() {
+            return apexQueryParams;
+        }
 
-    public void setSObjectId(String sObjectId) {
-        this.sObjectId = sObjectId;
-    }
+        public void setApexQueryParams(Map apexQueryParams) {
+            this.apexQueryParams = apexQueryParams;
+        }
 
-    public String getSObjectFields() {
-        return sObjectFields;
-    }
+        public ContentType getContentType() {
+            return contentType;
+        }
 
-    public void setSObjectFields(String sObjectFields) {
-        this.sObjectFields = sObjectFields;
-    }
+        public void setContentType(ContentType contentType) {
+            this.contentType = contentType;
+        }
 
-    public String getSObjectIdName() {
-        return sObjectIdName;
-    }
+        public String getJobId() {
+            return jobId;
+        }
 
-    public void setSObjectIdName(String sObjectIdName) {
-        this.sObjectIdName = sObjectIdName;
-    }
+        public void setJobId(String jobId) {
+            this.jobId = jobId;
+        }
 
-    public String getSObjectIdValue() {
-        return sObjectIdValue;
-    }
+        public String getBatchId() {
+            return batchId;
+        }
 
-    public void setSObjectIdValue(String sObjectIdValue) {
-        this.sObjectIdValue = sObjectIdValue;
-    }
+        public void setBatchId(String batchId) {
+            this.batchId = batchId;
+        }
 
-    public String getSObjectBlobFieldName() {
-        return sObjectBlobFieldName;
-    }
+        public String getResultId() {
+            return resultId;
+        }
 
-    public void setSObjectBlobFieldName(String sObjectBlobFieldName) {
-        this.sObjectBlobFieldName = sObjectBlobFieldName;
-    }
+        public void setResultId(String resultId) {
+            this.resultId = resultId;
+        }
 
-    public String getSObjectClass() {
-        return sObjectClass;
-    }
+        public Boolean getUpdateTopic() {
+            return updateTopic;
+        }
 
-    public void setSObjectClass(String sObjectClass) {
-        this.sObjectClass = sObjectClass;
-    }
+        public void setUpdateTopic(Boolean updateTopic) {
+            this.updateTopic = updateTopic;
+        }
 
-    public String getSObjectQuery() {
-        return sObjectQuery;
-    }
-
-    public void setSObjectQuery(String sObjectQuery) {
-        this.sObjectQuery = sObjectQuery;
-    }
-
-    public String getSObjectSearch() {
-        return sObjectSearch;
-    }
-
-    public void setSObjectSearch(String sObjectSearch) {
-        this.sObjectSearch = sObjectSearch;
-    }
+        public NotifyForFieldsEnum getNotifyForFields() {
+            return notifyForFields;
+        }
 
-    public String getApexMethod() {
-        return apexMethod;
-    }
-
-    public void setApexMethod(String apexMethod) {
-        this.apexMethod = apexMethod;
-    }
+        public void setNotifyForFields(NotifyForFieldsEnum notifyForFields) {
+            this.notifyForFields = notifyForFields;
+        }
 
-    public String getApexUrl() {
-        return apexUrl;
-    }
+        public NotifyForOperationsEnum getNotifyForOperations() {
+            return notifyForOperations;
+        }
 
-    public void setApexUrl(String apexUrl) {
-        this.apexUrl = apexUrl;
-    }
-
-    public Map<String, Object> getApexQueryParams() {
-        return apexQueryParams;
-    }
-
-    public void setApexQueryParams(Map<String, Object> apexQueryParams) {
-        this.apexQueryParams = apexQueryParams;
-    }
-
-    public ContentType getContentType() {
-        return contentType;
-    }
-
-    public void setContentType(ContentType contentType) {
-        this.contentType = contentType;
-    }
-
-    public String getJobId() {
-        return jobId;
-    }
-
-    public void setJobId(String jobId) {
-        this.jobId = jobId;
-    }
-
-    public String getBatchId() {
-        return batchId;
-    }
-
-    public void setBatchId(String batchId) {
-        this.batchId = batchId;
-    }
-
-    public String getResultId() {
-        return resultId;
-    }
-
-    public void setResultId(String resultId) {
-        this.resultId = resultId;
-    }
-
-    public Boolean getUpdateTopic() {
-        return updateTopic;
-    }
-
-    public void setUpdateTopic(Boolean updateTopic) {
-        this.updateTopic = updateTopic;
-    }
-
-    public NotifyForFieldsEnum getNotifyForFields() {
-        return notifyForFields;
-    }
-
-    public void setNotifyForFields(NotifyForFieldsEnum notifyForFields) {
-        this.notifyForFields = notifyForFields;
-    }
-
-    public NotifyForOperationsEnum getNotifyForOperations() {
-        return notifyForOperations;
-    }
-
-    public void setNotifyForOperations(
-            NotifyForOperationsEnum notifyForOperations) {
-        this.notifyForOperations = notifyForOperations;
-    }
-
-    public Boolean getNotifyForOperationCreate() {
-        return notifyForOperationCreate;
-    }
-
-    public void setNotifyForOperationCreate(Boolean notifyForOperationCreate) {
-        this.notifyForOperationCreate = notifyForOperationCreate;
-    }
-
-    public Boolean getNotifyForOperationUpdate() {
-        return notifyForOperationUpdate;
-    }
-
-    public void setNotifyForOperationUpdate(Boolean notifyForOperationUpdate) {
-        this.notifyForOperationUpdate = notifyForOperationUpdate;
-    }
-
-    public Boolean getNotifyForOperationDelete() {
-        return notifyForOperationDelete;
-    }
-
-    public void setNotifyForOperationDelete(Boolean notifyForOperationDelete) {
-        this.notifyForOperationDelete = notifyForOperationDelete;
-    }
-
-    public Boolean getNotifyForOperationUndelete() {
-        return notifyForOperationUndelete;
-    }
-
-    public void setNotifyForOperationUndelete(Boolean 
notifyForOperationUndelete) {
-        this.notifyForOperationUndelete = notifyForOperationUndelete;
-    }
-
-    public String getReportId() {
-        return reportId;
-    }
-
-    public void setReportId(String reportId) {
-        this.reportId = reportId;
-    }
-
-    public Boolean getIncludeDetails() {
-        return includeDetails;
-    }
-
-    public void setIncludeDetails(Boolean includeDetails) {
-        this.includeDetails = includeDetails;
-    }
-
-    public ReportMetadata getReportMetadata() {
-        return reportMetadata;
-    }
-
-    public void setReportMetadata(ReportMetadata reportMetadata) {
-        this.reportMetadata = reportMetadata;
-    }
-
-    public String getInstanceId() {
-        return instanceId;
-    }
-
-    public void setInstanceId(String instanceId) {
-        this.instanceId = instanceId;
-    }
-
-    public SalesforceHttpClient getHttpClient() {
-        return httpClient;
-    }
-
-    public void setHttpClient(SalesforceHttpClient httpClient) {
-        this.httpClient = httpClient;
-    }
-
-    public ObjectMapper getObjectMapper() {
-        return objectMapper;
-    }
-
-    public void setObjectMapper(ObjectMapper objectMapper) {
-        this.objectMapper = objectMapper;
-    }
-
-    public Integer getDefaultReplayId() {
-        return defaultReplayId;
-    }
-
-    public void setDefaultReplayId(Integer defaultReplayId) {
-        this.defaultReplayId = defaultReplayId;
-    }
-
-    public Map<String, Integer> getInitialReplayIdMap() {
-        return initialReplayIdMap;
-    }
-
-    public void setInitialReplayIdMap(Map<String, Integer> initialReplayIdMap) 
{
-        this.initialReplayIdMap = initialReplayIdMap;
-    }
-
-    public long getBackoffIncrement() {
-        return backoffIncrement;
-    }
-
-    public void setBackoffIncrement(long backoffIncrement) {
-        this.backoffIncrement = backoffIncrement;
-    }
-
-    public long getMaxBackoff() {
-        return maxBackoff;
-    }
+        public void setNotifyForOperations(
+                NotifyForOperationsEnum notifyForOperations) {
+            this.notifyForOperations = notifyForOperations;
+        }
+
+        public Boolean getNotifyForOperationCreate() {
+            return notifyForOperationCreate;
+        }
+
+        public void setNotifyForOperationCreate(Boolean 
notifyForOperationCreate) {
+            this.notifyForOperationCreate = notifyForOperationCreate;
+        }
+
+        public Boolean getNotifyForOperationUpdate() {
+            return notifyForOperationUpdate;
+        }
+
+        public void setNotifyForOperationUpdate(Boolean 
notifyForOperationUpdate) {
+            this.notifyForOperationUpdate = notifyForOperationUpdate;
+        }
 
-    public void setMaxBackoff(long maxBackoff) {
-        this.maxBackoff = maxBackoff;
+        public Boolean getNotifyForOperationDelete() {
+            return notifyForOperationDelete;
+        }
+
+        public void setNotifyForOperationDelete(Boolean 
notifyForOperationDelete) {
+            this.notifyForOperationDelete = notifyForOperationDelete;
+        }
+
+        public Boolean getNotifyForOperationUndelete() {
+            return notifyForOperationUndelete;
+        }
+
+        public void setNotifyForOperationUndelete(
+                Boolean notifyForOperationUndelete) {
+            this.notifyForOperationUndelete = notifyForOperationUndelete;
+        }
+
+        public String getReportId() {
+            return reportId;
+        }
+
+        public void setReportId(String reportId) {
+            this.reportId = reportId;
+        }
+
+        public Boolean getIncludeDetails() {
+            return includeDetails;
+        }
+
+        public void setIncludeDetails(Boolean includeDetails) {
+            this.includeDetails = includeDetails;
+        }
+
+        public ReportMetadata getReportMetadata() {
+            return reportMetadata;
+        }
+
+        public void setReportMetadata(ReportMetadata reportMetadata) {
+            this.reportMetadata = reportMetadata;
+        }
+
+        public String getInstanceId() {
+            return instanceId;
+        }
+
+        public void setInstanceId(String instanceId) {
+            this.instanceId = instanceId;
+        }
+
+        public SalesforceHttpClient getHttpClient() {
+            return httpClient;
+        }
+
+        public void setHttpClient(SalesforceHttpClient httpClient) {
+            this.httpClient = httpClient;
+        }
+
+        public ObjectMapper getObjectMapper() {
+            return objectMapper;
+        }
+
+        public void setObjectMapper(ObjectMapper objectMapper) {
+            this.objectMapper = objectMapper;
+        }
+
+        public Long getBackoffIncrement() {
+            return backoffIncrement;
+        }
+
+        public void setBackoffIncrement(Long backoffIncrement) {
+            this.backoffIncrement = backoffIncrement;
+        }
+
+        public Long getMaxBackoff() {
+            return maxBackoff;
+        }
+
+        public void setMaxBackoff(Long maxBackoff) {
+            this.maxBackoff = maxBackoff;
+        }
+
+        public Integer getDefaultReplayId() {
+            return defaultReplayId;
+        }
+
+        public void setDefaultReplayId(Integer defaultReplayId) {
+            this.defaultReplayId = defaultReplayId;
+        }
+
+        public Map getInitialReplayIdMap() {
+            return initialReplayIdMap;
+        }
+
+        public void setInitialReplayIdMap(Map initialReplayIdMap) {
+            this.initialReplayIdMap = initialReplayIdMap;
+        }
+    }
+
+    public static class SalesforceLoginConfigNestedConfiguration {
+        public static final Class CAMEL_NESTED_CLASS = 
org.apache.camel.component.salesforce.SalesforceLoginConfig.class;
+        /**
+         * Salesforce login URL, defaults to https://login.salesforce.com
+         */
+        private String loginUrl;
+        /**
+         * Salesforce connected application Consumer Key
+         */
+        private String clientId;
+        /**
+         * Salesforce connected application Consumer Secret
+         */
+        private String clientSecret;
+        /**
+         * Salesforce account user name
+         */
+        private String userName;
+        /**
+         * Salesforce account password
+         */
+        private String password;
+        /**
+         * Flag to enable/disable lazy OAuth, default is false. When enabled,
+         * OAuth token retrieval or generation is not done until the first API
+         * call
+         */
+        private Boolean lazyLogin;
+
+        public String getLoginUrl() {
+            return loginUrl;
+        }
+
+        public void setLoginUrl(String loginUrl) {
+            this.loginUrl = loginUrl;
+        }
+
+        public String getClientId() {
+            return clientId;
+        }
+
+        public void setClientId(String clientId) {
+            this.clientId = clientId;
+        }
+
+        public String getClientSecret() {
+            return clientSecret;
+        }
+
+        public void setClientSecret(String clientSecret) {
+            this.clientSecret = clientSecret;
+        }
+
+        public String getUserName() {
+            return userName;
+        }
+
+        public void setUserName(String userName) {
+            this.userName = userName;
+        }
+
+        public String getPassword() {
+            return password;
+        }
+
+        public void setPassword(String password) {
+            this.password = password;
+        }
+
+        public Boolean getLazyLogin() {
+            return lazyLogin;
+        }
+
+        public void setLazyLogin(Boolean lazyLogin) {
+            this.lazyLogin = lazyLogin;
+        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentAutoConfiguration.java
 
b/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentAutoConfiguration.java
index c52467f..7dc5adc 100644
--- 
a/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentAutoConfiguration.java
+++ 
b/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentAutoConfiguration.java
@@ -44,6 +44,26 @@ public class XQueryComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentConfiguration.java
 
b/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentConfiguration.java
index 8731955..2c99e0b 100644
--- 
a/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentConfiguration.java
+++ 
b/components-starter/camel-saxon-starter/src/main/java/org/apache/camel/component/xquery/springboot/XQueryComponentConfiguration.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.xquery.springboot;
 
 import net.sf.saxon.lib.ModuleURIResolver;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * Transforms the message using a XQuery template using Saxon.
@@ -30,6 +31,7 @@ public class XQueryComponentConfiguration {
     /**
      * To use the custom ModuleURIResolver
      */
+    @NestedConfigurationProperty
     private ModuleURIResolver moduleURIResolver;
 
     public ModuleURIResolver getModuleURIResolver() {

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentAutoConfiguration.java
 
b/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentAutoConfiguration.java
index 606e188..4744f3d 100644
--- 
a/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentAutoConfiguration.java
+++ 
b/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentAutoConfiguration.java
@@ -45,6 +45,26 @@ public class ServletComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentConfiguration.java
 
b/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentConfiguration.java
index 24fcebe..add4a67 100644
--- 
a/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentConfiguration.java
+++ 
b/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletComponentConfiguration.java
@@ -21,6 +21,7 @@ import org.apache.camel.http.common.HttpBinding;
 import org.apache.camel.http.common.HttpConfiguration;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * To use a HTTP Servlet as entry for Camel routes when running in a servlet
@@ -38,6 +39,7 @@ public class ServletComponentConfiguration {
     /**
      * To use a custom org.apache.camel.component.servlet.HttpRegistry.
      */
+    @NestedConfigurationProperty
     private HttpRegistry httpRegistry;
     /**
      * Whether to automatic bind multipart/form-data as attachments on the 
Camel
@@ -49,10 +51,12 @@ public class ServletComponentConfiguration {
      * To use a custom HttpBinding to control the mapping between Camel message
      * and HttpClient.
      */
+    @NestedConfigurationProperty
     private HttpBinding httpBinding;
     /**
      * To use the shared HttpConfiguration as base configuration.
      */
+    @NestedConfigurationProperty
     private HttpConfiguration httpConfiguration;
     /**
      * Whether to allow java serialization when a request uses
@@ -66,6 +70,7 @@ public class ServletComponentConfiguration {
      * To use a custom HeaderFilterStrategy to filter header to and from Camel
      * message.
      */
+    @NestedConfigurationProperty
     private HeaderFilterStrategy headerFilterStrategy;
 
     public String getServletName() {

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/batch/springboot/SjmsBatchComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/batch/springboot/SjmsBatchComponentAutoConfiguration.java
 
b/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/batch/springboot/SjmsBatchComponentAutoConfiguration.java
index e236e8e..42fb9cb 100644
--- 
a/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/batch/springboot/SjmsBatchComponentAutoConfiguration.java
+++ 
b/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/batch/springboot/SjmsBatchComponentAutoConfiguration.java
@@ -45,6 +45,26 @@ public class SjmsBatchComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentAutoConfiguration.java
 
b/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentAutoConfiguration.java
index 5683591..5b8903e 100644
--- 
a/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentAutoConfiguration.java
+++ 
b/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentAutoConfiguration.java
@@ -44,6 +44,26 @@ public class SjmsComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentConfiguration.java
 
b/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentConfiguration.java
index b45174d..cc9f895 100644
--- 
a/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentConfiguration.java
+++ 
b/components-starter/camel-sjms-starter/src/main/java/org/apache/camel/component/sjms/springboot/SjmsComponentConfiguration.java
@@ -22,9 +22,9 @@ import org.apache.camel.component.sjms.jms.ConnectionResource;
 import org.apache.camel.component.sjms.jms.DestinationCreationStrategy;
 import org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy;
 import org.apache.camel.component.sjms.jms.MessageCreatedStrategy;
-import org.apache.camel.component.sjms.taskmanager.TimedTaskManager;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * The sjms component (simple jms) allows messages to be sent to (or consumed
@@ -44,12 +44,14 @@ public class SjmsComponentConfiguration {
      * To use a custom HeaderFilterStrategy to filter header to and from Camel
      * message.
      */
+    @NestedConfigurationProperty
     private HeaderFilterStrategy headerFilterStrategy;
     /**
      * A ConnectionResource is an interface that allows for customization and
      * container control of the ConnectionFactory. See Plugable Connection
      * Resource Management for further details.
      */
+    @NestedConfigurationProperty
     private ConnectionResource connectionResource;
     /**
      * The maximum number of connections available to endpoints started under
@@ -66,25 +68,29 @@ public class SjmsComponentConfiguration {
      * org.apache.camel.component.jms.JmsKeyFormatStrategy and refer to it 
using
      * the notation.
      */
+    @NestedConfigurationProperty
     private JmsKeyFormatStrategy jmsKeyFormatStrategy;
     /**
      * To configure which kind of commit strategy to use. Camel provides two
      * implementations out of the box default and batch.
      */
+    @NestedConfigurationProperty
     private TransactionCommitStrategy transactionCommitStrategy;
     /**
      * To use a custom DestinationCreationStrategy.
      */
+    @NestedConfigurationProperty
     private DestinationCreationStrategy destinationCreationStrategy;
     /**
      * To use a custom TimedTaskManager
      */
-    private TimedTaskManager timedTaskManager;
+    private TimedTaskManagerNestedConfiguration timedTaskManager;
     /**
      * To use the given MessageCreatedStrategy which are invoked when Camel
      * creates new instances of javax.jms.Message objects when Camel is sending
      * a JMS message.
      */
+    @NestedConfigurationProperty
     private MessageCreatedStrategy messageCreatedStrategy;
 
     public ConnectionFactory getConnectionFactory() {
@@ -147,11 +153,12 @@ public class SjmsComponentConfiguration {
         this.destinationCreationStrategy = destinationCreationStrategy;
     }
 
-    public TimedTaskManager getTimedTaskManager() {
+    public TimedTaskManagerNestedConfiguration getTimedTaskManager() {
         return timedTaskManager;
     }
 
-    public void setTimedTaskManager(TimedTaskManager timedTaskManager) {
+    public void setTimedTaskManager(
+            TimedTaskManagerNestedConfiguration timedTaskManager) {
         this.timedTaskManager = timedTaskManager;
     }
 
@@ -163,4 +170,8 @@ public class SjmsComponentConfiguration {
             MessageCreatedStrategy messageCreatedStrategy) {
         this.messageCreatedStrategy = messageCreatedStrategy;
     }
+
+    public static class TimedTaskManagerNestedConfiguration {
+        public static final Class CAMEL_NESTED_CLASS = 
org.apache.camel.component.sjms.taskmanager.TimedTaskManager.class;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-slack-starter/src/main/java/org/apache/camel/component/slack/springboot/SlackComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-slack-starter/src/main/java/org/apache/camel/component/slack/springboot/SlackComponentAutoConfiguration.java
 
b/components-starter/camel-slack-starter/src/main/java/org/apache/camel/component/slack/springboot/SlackComponentAutoConfiguration.java
index 7b891ba..e9c14e9 100644
--- 
a/components-starter/camel-slack-starter/src/main/java/org/apache/camel/component/slack/springboot/SlackComponentAutoConfiguration.java
+++ 
b/components-starter/camel-slack-starter/src/main/java/org/apache/camel/component/slack/springboot/SlackComponentAutoConfiguration.java
@@ -44,6 +44,26 @@ public class SlackComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-smpp-starter/src/main/java/org/apache/camel/component/smpp/springboot/SmppComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-smpp-starter/src/main/java/org/apache/camel/component/smpp/springboot/SmppComponentAutoConfiguration.java
 
b/components-starter/camel-smpp-starter/src/main/java/org/apache/camel/component/smpp/springboot/SmppComponentAutoConfiguration.java
index d4b4816..0a92c0d 100644
--- 
a/components-starter/camel-smpp-starter/src/main/java/org/apache/camel/component/smpp/springboot/SmppComponentAutoConfiguration.java
+++ 
b/components-starter/camel-smpp-starter/src/main/java/org/apache/camel/component/smpp/springboot/SmppComponentAutoConfiguration.java
@@ -44,6 +44,26 @@ public class SmppComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

Reply via email to