You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ff...@apache.org on 2022/04/14 19:02:53 UTC

[camel-spring-boot] branch main updated: [CAMEL-17936]add tests in camel-salesforce-starter (#528)

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

ffang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git


The following commit(s) were added to refs/heads/main by this push:
     new 08c2190e6af [CAMEL-17936]add tests in camel-salesforce-starter (#528)
08c2190e6af is described below

commit 08c2190e6af10c88449b7299616dcf8a8536828a
Author: Freeman(Yue) Fang <fr...@gmail.com>
AuthorDate: Thu Apr 14 15:02:49 2022 -0400

    [CAMEL-17936]add tests in camel-salesforce-starter (#528)
---
 .../camel-salesforce-starter/pom.xml               |   6 +
 .../springboot/AbstractSalesforceTestBase.java     |  59 ++
 .../salesforce/springboot/LoginConfigHelper.java   | 150 ++++
 .../salesforce/springboot/RawPayloadTest.java      | 315 +++++++++
 .../springboot/dto/generated/Account.java          | 777 +++++++++++++++++++++
 .../dto/generated/Account_IndustryEnum.java        | 119 ++++
 .../salesforce/springboot/dto/generated/Asset.java | 176 +++++
 .../springboot/dto/generated/Contact.java          | 738 +++++++++++++++++++
 .../springboot/dto/generated/Document.java         | 286 ++++++++
 .../springboot/dto/generated/Line_Item__c.java     | 166 +++++
 .../springboot/dto/generated/MSPTest.java          |  87 +++
 .../springboot/dto/generated/Merchandise__c.java   | 150 ++++
 .../dto/generated/QueryRecordsAccount.java         |  22 +
 .../dto/generated/QueryRecordsContact.java         |  22 +
 .../dto/generated/QueryRecordsLine_Item__c.java    |  24 +
 .../springboot/dto/generated/RecordType.java       | 188 +++++
 .../springboot/dto/generated/StringMSPTest.java    |  50 ++
 .../salesforce/springboot/dto/generated/Task.java  |  70 ++
 .../salesforce/springboot/dto/generated/User.java  |  24 +
 19 files changed, 3429 insertions(+)

diff --git a/components-starter/camel-salesforce-starter/pom.xml b/components-starter/camel-salesforce-starter/pom.xml
index ce851c1a064..ef82cf3ee96 100644
--- a/components-starter/camel-salesforce-starter/pom.xml
+++ b/components-starter/camel-salesforce-starter/pom.xml
@@ -39,6 +39,12 @@
       <artifactId>camel-salesforce</artifactId>
       <version>${camel-version}</version>
     </dependency>
+    <dependency>
+      <groupId>com.squareup.okhttp3</groupId>
+      <artifactId>mockwebserver</artifactId>
+      <version>${okclient-version}</version>
+      <scope>test</scope>
+    </dependency>
     <!--START OF GENERATED CODE-->
     <dependency>
       <groupId>org.apache.camel.springboot</groupId>
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/AbstractSalesforceTestBase.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/AbstractSalesforceTestBase.java
new file mode 100644
index 00000000000..7c722b45cc8
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/AbstractSalesforceTestBase.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot;
+
+import java.util.HashMap;
+
+import org.apache.camel.component.salesforce.SalesforceComponent;
+import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
+import org.apache.camel.component.salesforce.springboot.dto.generated.Merchandise__c;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+
+public abstract class AbstractSalesforceTestBase  {
+
+    protected final Logger log = LoggerFactory.getLogger(getClass());
+    
+    
+    @Bean("salesforce")
+    protected SalesforceComponent createComponent() throws Exception {
+        // create the component
+        SalesforceComponent component = new SalesforceComponent();
+        final SalesforceEndpointConfig config = new SalesforceEndpointConfig();
+        config.setApiVersion(System.getProperty("apiVersion", salesforceApiVersionToUse()));
+        component.setConfig(config);
+        component.setLoginConfig(LoginConfigHelper.getLoginConfig());
+
+        HashMap<String, Object> clientProperties = new HashMap<>();
+        clientProperties.put("timeout", "60000");
+        clientProperties.put("maxRetries", "3");
+        // 4MB for RestApiIntegrationTest.testGetBlobField()
+        clientProperties.put("maxContentLength", String.valueOf(4 * 1024 * 1024));
+        component.setHttpClientProperties(clientProperties);
+
+        // set DTO package
+        component.setPackages(Merchandise__c.class.getPackage().getName());
+
+        return component;
+    }
+
+    protected String salesforceApiVersionToUse() {
+        return SalesforceEndpointConfig.DEFAULT_VERSION;
+    }
+
+}
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/LoginConfigHelper.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/LoginConfigHelper.java
new file mode 100644
index 00000000000..ef7de2be99a
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/LoginConfigHelper.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.apache.camel.component.salesforce.AuthenticationType;
+import org.apache.camel.component.salesforce.SalesforceLoginConfig;
+import org.apache.camel.support.jsse.KeyStoreParameters;
+import org.apache.camel.util.ObjectHelper;
+
+import static org.apache.camel.util.ObjectHelper.isNotEmpty;
+
+public final class LoginConfigHelper {
+
+    private static final LoginConfigHelper INSTANCE = new LoginConfigHelper();
+
+    private final Map<String, String> configuration;
+
+    private LoginConfigHelper() {
+        configuration = new HashMap<>();
+        try {
+            final ResourceBundle properties = ResourceBundle.getBundle("test-salesforce-login");
+            properties.keySet().forEach(k -> configuration.put(k, properties.getString(k)));
+        } catch (final MissingResourceException ignored) {
+            // ignoring if missing
+        }
+
+        System.getenv().keySet().stream()//
+                .filter(k -> k.startsWith("SALESFORCE_") && isNotEmpty(System.getenv(k)))
+                .forEach(k -> configuration.put(fromEnvName(k), System.getenv(k)));
+        System.getProperties().keySet().stream().map(String.class::cast)
+                .filter(k -> k.startsWith("salesforce.") && isNotEmpty(System.getProperty(k)))
+                .forEach(k -> configuration.put(k, System.getProperty(k)));
+    }
+
+    private String fromEnvName(final String envVariable) {
+        return envVariable.replace('_', '.').toLowerCase();
+    }
+
+    SalesforceLoginConfig createLoginConfig() {
+        final SalesforceLoginConfig loginConfig = new SalesforceLoginConfig();
+
+        final String explicitType = configuration.get("salesforce.auth.type");
+        if (ObjectHelper.isNotEmpty(explicitType)) {
+            loginConfig.setType(AuthenticationType.valueOf(explicitType));
+        }
+        final String loginUrl = configuration.get("salesforce.login.url");
+        if (ObjectHelper.isNotEmpty(loginUrl)) {
+            loginConfig.setLoginUrl(loginUrl);
+        }
+        loginConfig.setClientId(configuration.get("salesforce.client.id"));
+        loginConfig.setClientSecret(configuration.get("salesforce.client.secret"));
+        loginConfig.setUserName(configuration.get("salesforce.username"));
+        loginConfig.setPassword(configuration.get("salesforce.password"));
+
+        final KeyStoreParameters keystore = new KeyStoreParameters();
+        keystore.setResource(configuration.get("salesforce.keystore.resource"));
+        keystore.setPassword(configuration.get("salesforce.keystore.password"));
+        keystore.setType(configuration.get("salesforce.keystore.type"));
+        keystore.setProvider(configuration.get("salesforce.keystore.provider"));
+        loginConfig.setKeystore(keystore);
+
+        validate(loginConfig);
+
+        return loginConfig;
+    }
+
+    void validate(final SalesforceLoginConfig loginConfig) {
+        try {
+            loginConfig.validate();
+        } catch (final IllegalArgumentException e) {
+            System.out.println("To run integration tests Salesforce Authentication information is");
+            System.out.println("needed.");
+            System.out.println("You need to specify the configuration for running tests by either");
+            System.out.println("specifying environment variables, Maven properties or create a Java");
+            System.out.println("properties file at:");
+            System.out.println();
+            System.out.println("camel/components/camel-salesforce/test-salesforce-login.properties");
+            System.out.println();
+            System.out.println("With authentication information to access a Salesforce instance.");
+            System.out.println("You can use:");
+            System.out.println();
+            System.out.println("camel/components/camel-salesforce/test-salesforce-login.properties.sample");
+            System.out.println();
+            System.out.println("as reference. A free Salesforce developer account can be obtained at:");
+            System.out.println();
+            System.out.println("https://developer.salesforce.com");
+            System.out.println();
+            System.out.println("Properties that you need to set:");
+            System.out.println();
+            System.out.println("| Maven or properties file     | Environment variable         | Use    |");
+            System.out.println("|------------------------------+------------------------------+--------|");
+            System.out.println("| salesforce.client.id         | SALESFORCE_CLIENT_ID         | ALL    |");
+            System.out.println("| salesforce.client.secret     | SALESFORCE_CLIENT_SECRET     | UP, RT |");
+            System.out.println("| salesforce.username          | SALESFORCE_USERNAME          | UP, JWT|");
+            System.out.println("| salesforce.password          | SALESFORCE_PASSWORD          | UP     |");
+            System.out.println("| salesforce.refreshToken      | SALESFORCE_REFRESH_TOKEN     | RT     |");
+            System.out.println("| salesforce.keystore.path     | SALESFORCE_KEYSTORE_PATH     | JWT    |");
+            System.out.println("| salesforce.keystore.type     | SALESFORCE_KEYSTORE_TYPE     | JWT    |");
+            System.out.println("| salesforce.keystore.password | SALESFORCE_KEYSTORE_PASSWORD | JWT    |");
+            System.out.println("| salesforce.login.url         | SALESFORCE_LOGIN_URL         | ALL    |");
+            System.out.println();
+            System.out.println("* ALL - required always");
+            System.out.println("* UP  - when using username and password authentication");
+            System.out.println("* RT  - when using refresh token flow");
+            System.out.println("* JWT - when using JWT flow");
+            System.out.println();
+            System.out.println("You can force authentication type to be one of USERNAME_PASSWORD,");
+            System.out.println("REFRESH_TOKEN or JWT by setting `salesforce.auth.type` (or ");
+            System.out.println("`SALESFORCE_AUTH_TYPE` for environment variables).");
+            System.out.println();
+            System.out.println("Examples:");
+            System.out.println();
+            System.out.println("Using environment:");
+            System.out.println();
+            System.out.println("$ export SALESFORCE_CLIENT_ID=...");
+            System.out.println("$ export SALESFORCE_CLIENT_SECRET=...");
+            System.out.println("$ export ...others...");
+            System.out.println();
+            System.out.println("or using Maven properties:");
+            System.out.println();
+            System.out.println("$ mvn -Pintegration -Dsalesforce.client.id=... \\");
+            System.out.println("  -Dsalesforce.client.secret=... ...");
+            System.out.println();
+        }
+    }
+
+    public static SalesforceLoginConfig getLoginConfig() {
+        return INSTANCE.createLoginConfig();
+    }
+
+}
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/RawPayloadTest.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/RawPayloadTest.java
new file mode 100644
index 00000000000..16b1c231bdc
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/RawPayloadTest.java
@@ -0,0 +1,315 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.Route;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.salesforce.SalesforceComponent;
+import org.apache.camel.component.salesforce.SalesforceEndpointConfig;
+import org.apache.camel.component.salesforce.SalesforceLoginConfig;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import okhttp3.HttpUrl;
+import okhttp3.mockwebserver.Dispatcher;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.junit5.params.Parameters;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.eclipse.jetty.http.HttpHeader;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        RawPayloadTest.class,
+    }
+)
+
+
+public class RawPayloadTest extends AbstractSalesforceTestBase {
+    
+    @Autowired
+    ProducerTemplate template;
+    
+    @Autowired
+    CamelContext camelContext;
+
+    public static String format;
+
+    public static String endpointUri;
+
+    private static final String OAUTH2_TOKEN_PATH = "/services/oauth2/token";
+    private static final String XML_RESPONSE = "<response/>";
+    private static final String JSON_RESPONSE = "{ \"response\" : \"mock\" }";
+
+    private static HttpUrl loginUrl;
+    private static MockWebServer server;
+
+    private static String lastFormat;
+    private static String expectedResponse;
+    private static String requestBody;
+    private static Map<String, Object> headers;
+
+    @Override
+    @Bean("salesforce")
+    protected SalesforceComponent createComponent() throws Exception {
+
+        // create the component
+        SalesforceComponent component = new SalesforceComponent();
+        final SalesforceEndpointConfig config = new SalesforceEndpointConfig();
+        config.setApiVersion(System.getProperty("apiVersion", salesforceApiVersionToUse()));
+        component.setConfig(config);
+
+        SalesforceLoginConfig dummyLoginConfig = new SalesforceLoginConfig();
+        dummyLoginConfig.setClientId("ignored");
+        dummyLoginConfig.setClientSecret("ignored");
+        dummyLoginConfig.setRefreshToken("ignored");
+        dummyLoginConfig.setLoginUrl(loginUrl.toString());
+        component.setLoginConfig(dummyLoginConfig);
+
+        return component;
+    }
+
+    @AfterAll
+    public static void shutDownServer() throws IOException {
+        // shutdown mock server
+        if (server != null) {
+            server.shutdown();
+        }
+    }
+
+    @BeforeAll
+    public static void startServer() throws IOException {
+        //format = _format;
+        //endpointUri = _endpointUri;
+
+        // create mock server
+        server = new MockWebServer();
+
+        server.setDispatcher(new Dispatcher() {
+            @Override
+            public MockResponse dispatch(RecordedRequest recordedRequest) throws InterruptedException {
+                if (recordedRequest.getPath().equals(OAUTH2_TOKEN_PATH)) {
+                    return new MockResponse().setResponseCode(200)
+                            .setBody("{ \"access_token\": \"mock_token\", \"instance_url\": \"" + loginUrl + "\"}");
+                } else {
+                    return new MockResponse().setResponseCode(200)
+                            .setHeader(HttpHeader.CONTENT_TYPE.toString(),
+                                    recordedRequest.getHeader(HttpHeader.CONTENT_TYPE.toString()))
+                            .setBody("XML".equals(format) ? XML_RESPONSE : JSON_RESPONSE);
+                }
+            }
+        });
+
+        // start the server
+        server.start();
+        loginUrl = server.url("");
+    }
+
+    
+    private void setupRequestResponse(String format, String endpointUri) {
+        if (!format.equals(lastFormat)) {
+            // expected response and test request
+            final boolean isXml = "XML".equals(format);
+            expectedResponse = isXml ? XML_RESPONSE : JSON_RESPONSE;
+            if (isXml) {
+                requestBody = "<request/>";
+            } else {
+                requestBody = "{ \"request\" : \"mock\" }";
+            }
+            headers = new HashMap<>();
+            headers.put("sObjectId", "mockId");
+            headers.put("sObjectIdValue", "mockIdValue");
+            headers.put("id", "mockId");
+            headers.put(SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX + "id", "mockId");
+
+            lastFormat = format;
+        }
+    }
+    
+    private void stopRoutes() throws Exception {
+        List<Route> routes = camelContext.getRoutes();
+        for (Route route : routes) {
+            camelContext.getRouteController().stopRoute(route.getId());
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("parameters")
+    
+    public void testRestApi(String format, String endpointUri) throws Exception {
+        RawPayloadTest.format = format;
+        RawPayloadTest.endpointUri = endpointUri;
+        setupRequestResponse(format, endpointUri);
+        stopRoutes();
+        camelContext.addRoutes(new TestConfiguration(format, endpointUri).routeBuilder());
+        final String responseBody = template.requestBodyAndHeaders(endpointUri, requestBody, headers, String.class);
+        assertNotNull(responseBody, "Null response for endpoint " + endpointUri);
+        assertEquals(expectedResponse, responseBody, "Unexpected response for endpoint " + endpointUri);
+    }
+
+    // *************************************
+    // Config
+    // *************************************
+
+    public class TestConfiguration {
+        String format;
+        String endpointUri;
+        
+        public TestConfiguration(String format, String endpointUri) {
+            this.format = format;
+            this.endpointUri = endpointUri;
+        }
+
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    
+                    // testGetVersion
+                    from("direct:getVersions").to("salesforce:getVersions?rawPayload=true&format=" + format);
+
+                    // testGetResources
+                    from("direct:getResources").to("salesforce:getResources?rawPayload=true&format=" + format);
+
+                    // testGetGlobalObjects
+                    from("direct:getGlobalObjects").to("salesforce:getGlobalObjects?rawPayload=true&format=" + format);
+
+                    // testGetBasicInfo
+                    from("direct:getBasicInfo")
+                            .to("salesforce:getBasicInfo?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                    // testGetDescription
+                    from("direct:getDescription")
+                            .to("salesforce:getDescription?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                    // testGetSObject
+                    from("direct:getSObject").to(
+                            "salesforce:getSObject?sObjectName=Merchandise__c&sObjectFields=Description__c,Price__c&rawPayload=true&format="
+                                                 + format);
+
+                    // testCreateSObject
+                    from("direct:createSObject")
+                            .to("salesforce:createSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                    // testUpdateSObject
+                    from("direct:updateSObject")
+                            .to("salesforce:updateSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                    // testDeleteSObject
+                    from("direct:deleteSObject")
+                            .to("salesforce:deleteSObject?sObjectName=Merchandise__c&rawPayload=true&format=" + format);
+
+                    // testGetSObjectWithId
+                    from("direct:getSObjectWithId")
+                            .to("salesforce:getSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format="
+                                + format);
+
+                    // testUpsertSObject
+                    from("direct:upsertSObject")
+                            .to("salesforce:upsertSObject?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format="
+                                + format);
+
+                    // testDeleteSObjectWithId
+                    from("direct:deleteSObjectWithId")
+                            .to("salesforce:deleteSObjectWithId?sObjectName=Line_Item__c&sObjectIdName=Name&rawPayload=true&format="
+                                + format);
+
+                    // testGetBlobField
+                    from("direct:getBlobField")
+                            .to("salesforce:getBlobField?sObjectName=Document&sObjectBlobFieldName=Body&rawPayload=true&format="
+                                + format);
+
+                    // testQuery
+                    from("direct:query")
+                            .to("salesforce:query?sObjectQuery=SELECT name from Line_Item__c&rawPayload=true&format=" + format);
+
+                    // testQueryAll
+                    from("direct:queryAll")
+                            .to("salesforce:queryAll?sObjectQuery=SELECT name from Line_Item__c&rawPayload=true&format=" + format);
+
+                    // testSearch
+                    from("direct:search").to("salesforce:search?sObjectSearch=FIND {Wee}&rawPayload=true&format=" + format);
+
+                    // testApexCall
+                    from("direct:apexCallGet").to(
+                            "salesforce:apexCall?apexMethod=GET&apexUrl=Merchandise/{id}&sObjectName=Merchandise__c&rawPayload=true&format="
+                                                  + format);
+
+                    from("direct:apexCallGetWithId")
+                            .to("salesforce:apexCall/Merchandise/?apexMethod=GET&id=dummyId&rawPayload=true&format=" + format);
+
+                    from("direct:apexCallPatch")
+                            .to("salesforce:apexCall/Merchandise/?rawPayload=true&format=" + format + "&apexMethod=PATCH");
+
+                    // testComposite (only JSON format is supported)
+                    if (format.equalsIgnoreCase("json")) {
+                        from("direct:composite").to(
+                                "salesforce:composite?rawPayload=true&format=" + format
+                                                    + "&sObjectName=foo&sObjectIdName=bar&compositeMethod=PATCH");
+                    }
+                }
+            };
+        }
+    }
+    
+    
+    @Parameters(name = "format = {0}, endpoint = {1}")
+    public static List<String[]> parameters() {
+        final String[] endpoints = {
+                "direct:getVersions", "direct:getResources", "direct:getGlobalObjects", "direct:getBasicInfo",
+                "direct:getDescription", "direct:getSObject",
+                "direct:createSObject", "direct:updateSObject", "direct:deleteSObject", "direct:getSObjectWithId",
+                "direct:upsertSObject",
+                "direct:deleteSObjectWithId", "direct:getBlobField", "direct:query", "direct:queryAll", "direct:search",
+                "direct:apexCallGet", "direct:apexCallGetWithId", "direct:apexCallPatch",
+                "direct:composite" };
+
+        final String[] formats = { "XML", "JSON" };
+
+        return Stream.of(formats).flatMap(f -> Stream.of(endpoints)
+                .map(e -> new String[] { f, e }))
+                .filter(strings -> !(strings[0].equals("XML") && strings[1].equals("direct:composite")))
+                .collect(Collectors.toList());
+    }
+}
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Account.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Account.java
new file mode 100644
index 00000000000..30e03fe20c5
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Account.java
@@ -0,0 +1,777 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+
+//CHECKSTYLE:OFF
+/**
+ * Salesforce DTO for SObject Account
+ */
+public class Account extends AbstractDescribedSObjectBase {
+
+    public Account() {
+        getAttributes().setType("Account");
+    }
+
+    private static final SObjectDescription DESCRIPTION = createSObjectDescription();
+
+    private String MasterRecordId;
+
+    @JsonProperty("MasterRecordId")
+    public String getMasterRecordId() {
+        return this.MasterRecordId;
+    }
+
+    @JsonProperty("MasterRecordId")
+    public void setMasterRecordId(String MasterRecordId) {
+        this.MasterRecordId = MasterRecordId;
+    }
+
+    private Account MasterRecord;
+
+    @JsonProperty("MasterRecord")
+    public Account getMasterRecord() {
+        return this.MasterRecord;
+    }
+
+    private String ParentId;
+
+    @JsonProperty("ParentId")
+    public String getParentId() {
+        return this.ParentId;
+    }
+
+    @JsonProperty("ParentId")
+    public void setParentId(String ParentId) {
+        this.ParentId = ParentId;
+    }
+
+    private Account Parent;
+
+    @JsonProperty("Parent")
+    public Account getParent() {
+        return this.Parent;
+    }
+
+    @JsonProperty("Parent")
+    public void setParent(Account Parent) {
+        this.Parent = Parent;
+    }
+
+    private String BillingStreet;
+
+    @JsonProperty("BillingStreet")
+    public String getBillingStreet() {
+        return this.BillingStreet;
+    }
+
+    @JsonProperty("BillingStreet")
+    public void setBillingStreet(String BillingStreet) {
+        this.BillingStreet = BillingStreet;
+    }
+
+    private String BillingCity;
+
+    @JsonProperty("BillingCity")
+    public String getBillingCity() {
+        return this.BillingCity;
+    }
+
+    @JsonProperty("BillingCity")
+    public void setBillingCity(String BillingCity) {
+        this.BillingCity = BillingCity;
+    }
+
+    private String BillingState;
+
+    @JsonProperty("BillingState")
+    public String getBillingState() {
+        return this.BillingState;
+    }
+
+    @JsonProperty("BillingState")
+    public void setBillingState(String BillingState) {
+        this.BillingState = BillingState;
+    }
+
+    private String BillingPostalCode;
+
+    @JsonProperty("BillingPostalCode")
+    public String getBillingPostalCode() {
+        return this.BillingPostalCode;
+    }
+
+    @JsonProperty("BillingPostalCode")
+    public void setBillingPostalCode(String BillingPostalCode) {
+        this.BillingPostalCode = BillingPostalCode;
+    }
+
+    private String BillingCountry;
+
+    @JsonProperty("BillingCountry")
+    public String getBillingCountry() {
+        return this.BillingCountry;
+    }
+
+    @JsonProperty("BillingCountry")
+    public void setBillingCountry(String BillingCountry) {
+        this.BillingCountry = BillingCountry;
+    }
+
+    private Double BillingLatitude;
+
+    @JsonProperty("BillingLatitude")
+    public Double getBillingLatitude() {
+        return this.BillingLatitude;
+    }
+
+    @JsonProperty("BillingLatitude")
+    public void setBillingLatitude(Double BillingLatitude) {
+        this.BillingLatitude = BillingLatitude;
+    }
+
+    private Double BillingLongitude;
+
+    @JsonProperty("BillingLongitude")
+    public Double getBillingLongitude() {
+        return this.BillingLongitude;
+    }
+
+    @JsonProperty("BillingLongitude")
+    public void setBillingLongitude(Double BillingLongitude) {
+        this.BillingLongitude = BillingLongitude;
+    }
+
+    private org.apache.camel.component.salesforce.api.dto.Address BillingAddress;
+
+    @JsonProperty("BillingAddress")
+    public org.apache.camel.component.salesforce.api.dto.Address getBillingAddress() {
+        return this.BillingAddress;
+    }
+
+    @JsonProperty("BillingAddress")
+    public void setBillingAddress(org.apache.camel.component.salesforce.api.dto.Address BillingAddress) {
+        this.BillingAddress = BillingAddress;
+    }
+
+    private String ShippingStreet;
+
+    @JsonProperty("ShippingStreet")
+    public String getShippingStreet() {
+        return this.ShippingStreet;
+    }
+
+    @JsonProperty("ShippingStreet")
+    public void setShippingStreet(String ShippingStreet) {
+        this.ShippingStreet = ShippingStreet;
+    }
+
+    private String ShippingCity;
+
+    @JsonProperty("ShippingCity")
+    public String getShippingCity() {
+        return this.ShippingCity;
+    }
+
+    @JsonProperty("ShippingCity")
+    public void setShippingCity(String ShippingCity) {
+        this.ShippingCity = ShippingCity;
+    }
+
+    private String ShippingState;
+
+    @JsonProperty("ShippingState")
+    public String getShippingState() {
+        return this.ShippingState;
+    }
+
+    @JsonProperty("ShippingState")
+    public void setShippingState(String ShippingState) {
+        this.ShippingState = ShippingState;
+    }
+
+    private String ShippingPostalCode;
+
+    @JsonProperty("ShippingPostalCode")
+    public String getShippingPostalCode() {
+        return this.ShippingPostalCode;
+    }
+
+    @JsonProperty("ShippingPostalCode")
+    public void setShippingPostalCode(String ShippingPostalCode) {
+        this.ShippingPostalCode = ShippingPostalCode;
+    }
+
+    private String ShippingCountry;
+
+    @JsonProperty("ShippingCountry")
+    public String getShippingCountry() {
+        return this.ShippingCountry;
+    }
+
+    @JsonProperty("ShippingCountry")
+    public void setShippingCountry(String ShippingCountry) {
+        this.ShippingCountry = ShippingCountry;
+    }
+
+    private Double ShippingLatitude;
+
+    @JsonProperty("ShippingLatitude")
+    public Double getShippingLatitude() {
+        return this.ShippingLatitude;
+    }
+
+    @JsonProperty("ShippingLatitude")
+    public void setShippingLatitude(Double ShippingLatitude) {
+        this.ShippingLatitude = ShippingLatitude;
+    }
+
+    private Double ShippingLongitude;
+
+    @JsonProperty("ShippingLongitude")
+    public Double getShippingLongitude() {
+        return this.ShippingLongitude;
+    }
+
+    @JsonProperty("ShippingLongitude")
+    public void setShippingLongitude(Double ShippingLongitude) {
+        this.ShippingLongitude = ShippingLongitude;
+    }
+
+    private org.apache.camel.component.salesforce.api.dto.Address ShippingAddress;
+
+    @JsonProperty("ShippingAddress")
+    public org.apache.camel.component.salesforce.api.dto.Address getShippingAddress() {
+        return this.ShippingAddress;
+    }
+
+    @JsonProperty("ShippingAddress")
+    public void setShippingAddress(org.apache.camel.component.salesforce.api.dto.Address ShippingAddress) {
+        this.ShippingAddress = ShippingAddress;
+    }
+
+    private String Phone;
+
+    @JsonProperty("Phone")
+    public String getPhone() {
+        return this.Phone;
+    }
+
+    @JsonProperty("Phone")
+    public void setPhone(String Phone) {
+        this.Phone = Phone;
+    }
+
+    private String Fax;
+
+    @JsonProperty("Fax")
+    public String getFax() {
+        return this.Fax;
+    }
+
+    @JsonProperty("Fax")
+    public void setFax(String Fax) {
+        this.Fax = Fax;
+    }
+
+    private String AccountNumber;
+
+    @JsonProperty("AccountNumber")
+    public String getAccountNumber() {
+        return this.AccountNumber;
+    }
+
+    @JsonProperty("AccountNumber")
+    public void setAccountNumber(String AccountNumber) {
+        this.AccountNumber = AccountNumber;
+    }
+
+    private String Website;
+
+    @JsonProperty("Website")
+    public String getWebsite() {
+        return this.Website;
+    }
+
+    @JsonProperty("Website")
+    public void setWebsite(String Website) {
+        this.Website = Website;
+    }
+
+    private String PhotoUrl;
+
+    @JsonProperty("PhotoUrl")
+    public String getPhotoUrl() {
+        return this.PhotoUrl;
+    }
+
+    @JsonProperty("PhotoUrl")
+    public void setPhotoUrl(String PhotoUrl) {
+        this.PhotoUrl = PhotoUrl;
+    }
+
+    private String Sic;
+
+    @JsonProperty("Sic")
+    public String getSic() {
+        return this.Sic;
+    }
+
+    @JsonProperty("Sic")
+    public void setSic(String Sic) {
+        this.Sic = Sic;
+    }
+
+    private Account_IndustryEnum Industry;
+
+    @JsonProperty("Industry")
+    public Account_IndustryEnum getIndustry() {
+        return this.Industry;
+    }
+
+    @JsonProperty("Industry")
+    public void setIndustry(Account_IndustryEnum Industry) {
+        this.Industry = Industry;
+    }
+
+    private Double AnnualRevenue;
+
+    @JsonProperty("AnnualRevenue")
+    public Double getAnnualRevenue() {
+        return this.AnnualRevenue;
+    }
+
+    @JsonProperty("AnnualRevenue")
+    public void setAnnualRevenue(Double AnnualRevenue) {
+        this.AnnualRevenue = AnnualRevenue;
+    }
+
+    private Integer NumberOfEmployees;
+
+    @JsonProperty("NumberOfEmployees")
+    public Integer getNumberOfEmployees() {
+        return this.NumberOfEmployees;
+    }
+
+    @JsonProperty("NumberOfEmployees")
+    public void setNumberOfEmployees(Integer NumberOfEmployees) {
+        this.NumberOfEmployees = NumberOfEmployees;
+    }
+
+    private String TickerSymbol;
+
+    @JsonProperty("TickerSymbol")
+    public String getTickerSymbol() {
+        return this.TickerSymbol;
+    }
+
+    @JsonProperty("TickerSymbol")
+    public void setTickerSymbol(String TickerSymbol) {
+        this.TickerSymbol = TickerSymbol;
+    }
+
+    private String Description;
+
+    @JsonProperty("Description")
+    public String getDescription() {
+        return this.Description;
+    }
+
+    @JsonProperty("Description")
+    public void setDescription(String Description) {
+        this.Description = Description;
+    }
+
+    private String Site;
+
+    @JsonProperty("Site")
+    public String getSite() {
+        return this.Site;
+    }
+
+    @JsonProperty("Site")
+    public void setSite(String Site) {
+        this.Site = Site;
+    }
+
+    private String Jigsaw;
+
+    @JsonProperty("Jigsaw")
+    public String getJigsaw() {
+        return this.Jigsaw;
+    }
+
+    @JsonProperty("Jigsaw")
+    public void setJigsaw(String Jigsaw) {
+        this.Jigsaw = Jigsaw;
+    }
+
+    private String JigsawCompanyId;
+
+    @JsonProperty("JigsawCompanyId")
+    public String getJigsawCompanyId() {
+        return this.JigsawCompanyId;
+    }
+
+    @JsonProperty("JigsawCompanyId")
+    public void setJigsawCompanyId(String JigsawCompanyId) {
+        this.JigsawCompanyId = JigsawCompanyId;
+    }
+
+    private String DunsNumber;
+
+    @JsonProperty("DunsNumber")
+    public String getDunsNumber() {
+        return this.DunsNumber;
+    }
+
+    @JsonProperty("DunsNumber")
+    public void setDunsNumber(String DunsNumber) {
+        this.DunsNumber = DunsNumber;
+    }
+
+    private String Tradestyle;
+
+    @JsonProperty("Tradestyle")
+    public String getTradestyle() {
+        return this.Tradestyle;
+    }
+
+    @JsonProperty("Tradestyle")
+    public void setTradestyle(String Tradestyle) {
+        this.Tradestyle = Tradestyle;
+    }
+
+    private String NaicsCode;
+
+    @JsonProperty("NaicsCode")
+    public String getNaicsCode() {
+        return this.NaicsCode;
+    }
+
+    @JsonProperty("NaicsCode")
+    public void setNaicsCode(String NaicsCode) {
+        this.NaicsCode = NaicsCode;
+    }
+
+    private String NaicsDesc;
+
+    @JsonProperty("NaicsDesc")
+    public String getNaicsDesc() {
+        return this.NaicsDesc;
+    }
+
+    @JsonProperty("NaicsDesc")
+    public void setNaicsDesc(String NaicsDesc) {
+        this.NaicsDesc = NaicsDesc;
+    }
+
+    private String YearStarted;
+
+    @JsonProperty("YearStarted")
+    public String getYearStarted() {
+        return this.YearStarted;
+    }
+
+    @JsonProperty("YearStarted")
+    public void setYearStarted(String YearStarted) {
+        this.YearStarted = YearStarted;
+    }
+
+    private String SicDesc;
+
+    @JsonProperty("SicDesc")
+    public String getSicDesc() {
+        return this.SicDesc;
+    }
+
+    @JsonProperty("SicDesc")
+    public void setSicDesc(String SicDesc) {
+        this.SicDesc = SicDesc;
+    }
+
+    private String DandbCompanyId;
+
+    @JsonProperty("DandbCompanyId")
+    public String getDandbCompanyId() {
+        return this.DandbCompanyId;
+    }
+
+    @JsonProperty("DandbCompanyId")
+    public void setDandbCompanyId(String DandbCompanyId) {
+        this.DandbCompanyId = DandbCompanyId;
+    }
+
+    private String OperatingHoursId;
+
+    @JsonProperty("OperatingHoursId")
+    public String getOperatingHoursId() {
+        return this.OperatingHoursId;
+    }
+
+    @JsonProperty("OperatingHoursId")
+    public void setOperatingHoursId(String OperatingHoursId) {
+        this.OperatingHoursId = OperatingHoursId;
+    }
+
+    private Double Shipping_Location__Latitude__s;
+
+    @JsonProperty("Shipping_Location__Latitude__s")
+    public Double getShipping_Location__Latitude__s() {
+        return this.Shipping_Location__Latitude__s;
+    }
+
+    @JsonProperty("Shipping_Location__Latitude__s")
+    public void setShipping_Location__Latitude__s(Double Shipping_Location__Latitude__s) {
+        this.Shipping_Location__Latitude__s = Shipping_Location__Latitude__s;
+    }
+
+    private Double Shipping_Location__Longitude__s;
+
+    @JsonProperty("Shipping_Location__Longitude__s")
+    public Double getShipping_Location__Longitude__s() {
+        return this.Shipping_Location__Longitude__s;
+    }
+
+    @JsonProperty("Shipping_Location__Longitude__s")
+    public void setShipping_Location__Longitude__s(Double Shipping_Location__Longitude__s) {
+        this.Shipping_Location__Longitude__s = Shipping_Location__Longitude__s;
+    }
+
+    private org.apache.camel.component.salesforce.api.dto.GeoLocation Shipping_Location__c;
+
+    @JsonProperty("Shipping_Location__c")
+    public org.apache.camel.component.salesforce.api.dto.GeoLocation getShipping_Location__c() {
+        return this.Shipping_Location__c;
+    }
+
+    @JsonProperty("Shipping_Location__c")
+    public void setShipping_Location__c(org.apache.camel.component.salesforce.api.dto.GeoLocation Shipping_Location__c) {
+        this.Shipping_Location__c = Shipping_Location__c;
+    }
+
+    private String External_Id__c;
+
+    @JsonProperty("External_Id__c")
+    public String getExternal_Id__c() {
+        return this.External_Id__c;
+    }
+
+    @JsonProperty("External_Id__c")
+    public void setExternal_Id__c(String External_Id__c) {
+        this.External_Id__c = External_Id__c;
+    }
+
+    private QueryRecordsAccount ChildAccounts;
+
+    @JsonProperty("ChildAccounts")
+    public QueryRecordsAccount getChildAccounts() {
+        return ChildAccounts;
+    }
+
+    @JsonProperty("ChildAccounts")
+    public void setChildAccounts(QueryRecordsAccount ChildAccounts) {
+        this.ChildAccounts = ChildAccounts;
+    }
+
+    private QueryRecordsContact Contacts;
+
+    @JsonProperty("Contacts")
+    public QueryRecordsContact getContacts() {
+        return Contacts;
+    }
+
+    @JsonProperty("Contacts")
+    public void setContacts(QueryRecordsContact Contacts) {
+        this.Contacts = Contacts;
+    }
+
+    @Override
+    public final SObjectDescription description() {
+        return DESCRIPTION;
+    }
+
+    private static SObjectDescription createSObjectDescription() {
+        final SObjectDescription description = new SObjectDescription();
+
+        final List<SObjectField> fields1 = new ArrayList<>();
+        description.setFields(fields1);
+
+        final SObjectField sObjectField1 = createField("Id", "Account ID", "id", "tns:ID", 18, false, false, false, false, false, false, true);
+        fields1.add(sObjectField1);
+        final SObjectField sObjectField2 = createField("IsDeleted", "Deleted", "boolean", "xsd:boolean", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField2);
+        final SObjectField sObjectField3 = createField("MasterRecordId", "Master Record ID", "reference", "tns:ID", 18, false, true, false, false, false, false, false);
+        fields1.add(sObjectField3);
+        final SObjectField sObjectField4 = createField("Name", "Account Name", "string", "xsd:string", 255, false, false, true, false, false, false, false);
+        fields1.add(sObjectField4);
+        final SObjectField sObjectField5 = createField("Type", "Account Type", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField5);
+        final SObjectField sObjectField6 = createField("ParentId", "Parent Account ID", "reference", "tns:ID", 18, false, true, false, false, false, false, false);
+        fields1.add(sObjectField6);
+        final SObjectField sObjectField7 = createField("BillingStreet", "Billing Street", "textarea", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField7);
+        final SObjectField sObjectField8 = createField("BillingCity", "Billing City", "string", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField8);
+        final SObjectField sObjectField9 = createField("BillingState", "Billing State/Province", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField9);
+        final SObjectField sObjectField10 = createField("BillingPostalCode", "Billing Zip/Postal Code", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField10);
+        final SObjectField sObjectField11 = createField("BillingCountry", "Billing Country", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField11);
+        final SObjectField sObjectField12 = createField("BillingLatitude", "Billing Latitude", "double", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField12);
+        final SObjectField sObjectField13 = createField("BillingLongitude", "Billing Longitude", "double", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField13);
+        final SObjectField sObjectField14 = createField("BillingGeocodeAccuracy", "Billing Geocode Accuracy", "picklist", "xsd:string", 40, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField14);
+        final SObjectField sObjectField15 = createField("BillingAddress", "Billing Address", "address", "urn:address", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField15);
+        final SObjectField sObjectField16 = createField("ShippingStreet", "Shipping Street", "textarea", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField16);
+        final SObjectField sObjectField17 = createField("ShippingCity", "Shipping City", "string", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField17);
+        final SObjectField sObjectField18 = createField("ShippingState", "Shipping State/Province", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField18);
+        final SObjectField sObjectField19 = createField("ShippingPostalCode", "Shipping Zip/Postal Code", "string", "xsd:string", 20, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField19);
+        final SObjectField sObjectField20 = createField("ShippingCountry", "Shipping Country", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField20);
+        final SObjectField sObjectField21 = createField("ShippingLatitude", "Shipping Latitude", "double", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField21);
+        final SObjectField sObjectField22 = createField("ShippingLongitude", "Shipping Longitude", "double", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField22);
+        final SObjectField sObjectField23 = createField("ShippingGeocodeAccuracy", "Shipping Geocode Accuracy", "picklist", "xsd:string", 40, false, true, false, false, false,
+                                                        false, false);
+        fields1.add(sObjectField23);
+        final SObjectField sObjectField24 = createField("ShippingAddress", "Shipping Address", "address", "urn:address", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField24);
+        final SObjectField sObjectField25 = createField("Phone", "Account Phone", "phone", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField25);
+        final SObjectField sObjectField26 = createField("Fax", "Account Fax", "phone", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField26);
+        final SObjectField sObjectField27 = createField("AccountNumber", "Account Number", "string", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField27);
+        final SObjectField sObjectField28 = createField("Website", "Website", "url", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField28);
+        final SObjectField sObjectField29 = createField("PhotoUrl", "Photo URL", "url", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField29);
+        final SObjectField sObjectField30 = createField("Sic", "SIC Code", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField30);
+        final SObjectField sObjectField31 = createField("Industry", "Industry", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField31);
+        final SObjectField sObjectField32 = createField("AnnualRevenue", "Annual Revenue", "currency", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField32);
+        final SObjectField sObjectField33 = createField("NumberOfEmployees", "Employees", "int", "xsd:int", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField33);
+        final SObjectField sObjectField34 = createField("Ownership", "Ownership", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField34);
+        final SObjectField sObjectField35 = createField("TickerSymbol", "Ticker Symbol", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField35);
+        final SObjectField sObjectField36 = createField("Description", "Account Description", "textarea", "xsd:string", 32000, false, true, false, false, false, false, false);
+        fields1.add(sObjectField36);
+        final SObjectField sObjectField37 = createField("Rating", "Account Rating", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField37);
+        final SObjectField sObjectField38 = createField("Site", "Account Site", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField38);
+        final SObjectField sObjectField39 = createField("OwnerId", "Owner ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField39);
+        final SObjectField sObjectField40 = createField("CreatedDate", "Created Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField40);
+        final SObjectField sObjectField41 = createField("CreatedById", "Created By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField41);
+        final SObjectField sObjectField42 = createField("LastModifiedDate", "Last Modified Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField42);
+        final SObjectField sObjectField43 = createField("LastModifiedById", "Last Modified By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField43);
+        final SObjectField sObjectField44 = createField("SystemModstamp", "System Modstamp", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField44);
+        final SObjectField sObjectField45 = createField("LastActivityDate", "Last Activity", "date", "xsd:date", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField45);
+        final SObjectField sObjectField46 = createField("LastViewedDate", "Last Viewed Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField46);
+        final SObjectField sObjectField47 = createField("LastReferencedDate", "Last Referenced Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField47);
+        final SObjectField sObjectField48 = createField("Jigsaw", "Data.com Key", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField48);
+        final SObjectField sObjectField49 = createField("JigsawCompanyId", "Jigsaw Company ID", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField49);
+        final SObjectField sObjectField50 = createField("CleanStatus", "Clean Status", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField50);
+        final SObjectField sObjectField51 = createField("AccountSource", "Account Source", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField51);
+        final SObjectField sObjectField52 = createField("DunsNumber", "D-U-N-S Number", "string", "xsd:string", 9, false, true, false, false, false, false, false);
+        fields1.add(sObjectField52);
+        final SObjectField sObjectField53 = createField("Tradestyle", "Tradestyle", "string", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField53);
+        final SObjectField sObjectField54 = createField("NaicsCode", "NAICS Code", "string", "xsd:string", 8, false, true, false, false, false, false, false);
+        fields1.add(sObjectField54);
+        final SObjectField sObjectField55 = createField("NaicsDesc", "NAICS Description", "string", "xsd:string", 120, false, true, false, false, false, false, false);
+        fields1.add(sObjectField55);
+        final SObjectField sObjectField56 = createField("YearStarted", "Year Started", "string", "xsd:string", 4, false, true, false, false, false, false, false);
+        fields1.add(sObjectField56);
+        final SObjectField sObjectField57 = createField("SicDesc", "SIC Description", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField57);
+        final SObjectField sObjectField58 = createField("DandbCompanyId", "D&B Company ID", "reference", "tns:ID", 18, false, true, false, false, false, false, false);
+        fields1.add(sObjectField58);
+        final SObjectField sObjectField59 = createField("OperatingHoursId", "Operating Hour ID", "reference", "tns:ID", 18, false, true, false, false, false, false, false);
+        fields1.add(sObjectField59);
+        final SObjectField sObjectField60 = createField("Shipping_Location__Latitude__s", "Shipping_Location (Latitude)", "double", "xsd:double", 0, false, true, false, false,
+                                                        true, false, false);
+        fields1.add(sObjectField60);
+        final SObjectField sObjectField61 = createField("Shipping_Location__Longitude__s", "Shipping_Location (Longitude)", "double", "xsd:double", 0, false, true, false, false,
+                                                        true, false, false);
+        fields1.add(sObjectField61);
+        final SObjectField sObjectField62 = createField("Shipping_Location__c", "Shipping_Location", "location", "urn:location", 0, false, true, false, false, true, false, false);
+        fields1.add(sObjectField62);
+        final SObjectField sObjectField63 = createField("External_Id__c", "External Id", "string", "xsd:string", 255, true, true, false, true, true, false, true);
+        fields1.add(sObjectField63);
+
+        description.setLabel("Account");
+        description.setLabelPlural("Accounts");
+        description.setName("Account");
+
+        final SObjectDescriptionUrls sObjectDescriptionUrls1 = new SObjectDescriptionUrls();
+        sObjectDescriptionUrls1.setApprovalLayouts("/services/data/v45.0/sobjects/Account/describe/approvalLayouts");
+        sObjectDescriptionUrls1.setCompactLayouts("/services/data/v45.0/sobjects/Account/describe/compactLayouts");
+        sObjectDescriptionUrls1.setDefaultValues("/services/data/v45.0/sobjects/Account/defaultValues?recordTypeId&fields");
+        sObjectDescriptionUrls1.setDescribe("/services/data/v45.0/sobjects/Account/describe");
+        sObjectDescriptionUrls1.setLayouts("/services/data/v45.0/sobjects/Account/describe/layouts");
+        sObjectDescriptionUrls1.setListviews("/services/data/v45.0/sobjects/Account/listviews");
+        sObjectDescriptionUrls1.setQuickActions("/services/data/v45.0/sobjects/Account/quickActions");
+        sObjectDescriptionUrls1.setRowTemplate("/services/data/v45.0/sobjects/Account/{ID}");
+        sObjectDescriptionUrls1.setSobject("/services/data/v45.0/sobjects/Account");
+        sObjectDescriptionUrls1.setUiDetailTemplate("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/{ID}");
+        sObjectDescriptionUrls1.setUiEditTemplate("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/{ID}/e");
+        sObjectDescriptionUrls1.setUiNewRecord("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/001/e");
+        description.setUrls(sObjectDescriptionUrls1);
+
+        return description;
+    }
+}
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Account_IndustryEnum.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Account_IndustryEnum.java
new file mode 100644
index 00000000000..4f4eeb1c96b
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Account_IndustryEnum.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * Salesforce DTO generated by camel-salesforce-maven-plugin
+ * Generated on: Thu Dec 08 10:54:02 CET 2016
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+//CHECKSTYLE:OFF
+/**
+ * Salesforce Enumeration DTO for picklist Industry
+ */
+public enum Account_IndustryEnum {
+
+    // Agriculture
+    AGRICULTURE("Agriculture"),
+    // Apparel
+    APPAREL("Apparel"),
+    // Banking
+    BANKING("Banking"),
+    // Biotechnology
+    BIOTECHNOLOGY("Biotechnology"),
+    // Chemicals
+    CHEMICALS("Chemicals"),
+    // Communications
+    COMMUNICATIONS("Communications"),
+    // Construction
+    CONSTRUCTION("Construction"),
+    // Consulting
+    CONSULTING("Consulting"),
+    // Education
+    EDUCATION("Education"),
+    // Electronics
+    ELECTRONICS("Electronics"),
+    // Energy
+    ENERGY("Energy"),
+    // Engineering
+    ENGINEERING("Engineering"),
+    // Entertainment
+    ENTERTAINMENT("Entertainment"),
+    // Environmental
+    ENVIRONMENTAL("Environmental"),
+    // Finance
+    FINANCE("Finance"),
+    // Food & Beverage
+    FOOD___BEVERAGE("Food & Beverage"),
+    // Government
+    GOVERNMENT("Government"),
+    // Healthcare
+    HEALTHCARE("Healthcare"),
+    // Hospitality
+    HOSPITALITY("Hospitality"),
+    // Insurance
+    INSURANCE("Insurance"),
+    // Machinery
+    MACHINERY("Machinery"),
+    // Manufacturing
+    MANUFACTURING("Manufacturing"),
+    // Media
+    MEDIA("Media"),
+    // Not For Profit
+    NOT_FOR_PROFIT("Not For Profit"),
+    // Other
+    OTHER("Other"),
+    // Recreation
+    RECREATION("Recreation"),
+    // Retail
+    RETAIL("Retail"),
+    // Shipping
+    SHIPPING("Shipping"),
+    // Technology
+    TECHNOLOGY("Technology"),
+    // Telecommunications
+    TELECOMMUNICATIONS("Telecommunications"),
+    // Transportation
+    TRANSPORTATION("Transportation"),
+    // Utilities
+    UTILITIES("Utilities");
+
+    final String value;
+
+    private Account_IndustryEnum(String value) {
+        this.value = value;
+    }
+
+    @JsonValue
+    public String value() {
+        return this.value;
+    }
+
+    @JsonCreator
+    public static Account_IndustryEnum fromValue(String value) {
+        for (Account_IndustryEnum e : Account_IndustryEnum.values()) {
+            if (e.value.equals(value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException(value);
+    }
+
+}
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Asset.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Asset.java
new file mode 100644
index 00000000000..f4838652971
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Asset.java
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
+
+//CHECKSTYLE:OFF
+/**
+ * Salesforce DTO for SObject Asset
+ */
+public class Asset extends AbstractSObjectBase {
+
+    public Asset() {
+        getAttributes().setType("Asset");
+    }
+
+    // ContactId
+    private String ContactId;
+
+    @JsonProperty("ContactId")
+    public String getContactId() {
+        return this.ContactId;
+    }
+
+    @JsonProperty("ContactId")
+    public void setContactId(String ContactId) {
+        this.ContactId = ContactId;
+    }
+
+    // AccountId
+    private String AccountId;
+
+    @JsonProperty("AccountId")
+    public String getAccountId() {
+        return this.AccountId;
+    }
+
+    @JsonProperty("AccountId")
+    public void setAccountId(String AccountId) {
+        this.AccountId = AccountId;
+    }
+
+    // Product2Id
+    private String Product2Id;
+
+    @JsonProperty("Product2Id")
+    public String getProduct2Id() {
+        return this.Product2Id;
+    }
+
+    @JsonProperty("Product2Id")
+    public void setProduct2Id(String Product2Id) {
+        this.Product2Id = Product2Id;
+    }
+
+    // IsCompetitorProduct
+    private Boolean IsCompetitorProduct;
+
+    @JsonProperty("IsCompetitorProduct")
+    public Boolean getIsCompetitorProduct() {
+        return this.IsCompetitorProduct;
+    }
+
+    @JsonProperty("IsCompetitorProduct")
+    public void setIsCompetitorProduct(Boolean IsCompetitorProduct) {
+        this.IsCompetitorProduct = IsCompetitorProduct;
+    }
+
+    // SerialNumber
+    private String SerialNumber;
+
+    @JsonProperty("SerialNumber")
+    public String getSerialNumber() {
+        return this.SerialNumber;
+    }
+
+    @JsonProperty("SerialNumber")
+    public void setSerialNumber(String SerialNumber) {
+        this.SerialNumber = SerialNumber;
+    }
+
+    // InstallDate
+    private java.time.ZonedDateTime InstallDate;
+
+    @JsonProperty("InstallDate")
+    public java.time.ZonedDateTime getInstallDate() {
+        return this.InstallDate;
+    }
+
+    @JsonProperty("InstallDate")
+    public void setInstallDate(java.time.ZonedDateTime InstallDate) {
+        this.InstallDate = InstallDate;
+    }
+
+    // PurchaseDate
+    private java.time.ZonedDateTime PurchaseDate;
+
+    @JsonProperty("PurchaseDate")
+    public java.time.ZonedDateTime getPurchaseDate() {
+        return this.PurchaseDate;
+    }
+
+    @JsonProperty("PurchaseDate")
+    public void setPurchaseDate(java.time.ZonedDateTime PurchaseDate) {
+        this.PurchaseDate = PurchaseDate;
+    }
+
+    // UsageEndDate
+    private java.time.ZonedDateTime UsageEndDate;
+
+    @JsonProperty("UsageEndDate")
+    public java.time.ZonedDateTime getUsageEndDate() {
+        return this.UsageEndDate;
+    }
+
+    @JsonProperty("UsageEndDate")
+    public void setUsageEndDate(java.time.ZonedDateTime UsageEndDate) {
+        this.UsageEndDate = UsageEndDate;
+    }
+
+    // Price
+    private Double Price;
+
+    @JsonProperty("Price")
+    public Double getPrice() {
+        return this.Price;
+    }
+
+    @JsonProperty("Price")
+    public void setPrice(Double Price) {
+        this.Price = Price;
+    }
+
+    // Quantity
+    private Double Quantity;
+
+    @JsonProperty("Quantity")
+    public Double getQuantity() {
+        return this.Quantity;
+    }
+
+    @JsonProperty("Quantity")
+    public void setQuantity(Double Quantity) {
+        this.Quantity = Quantity;
+    }
+
+    // Description
+    private String Description;
+
+    @JsonProperty("Description")
+    public String getDescription() {
+        return this.Description;
+    }
+
+    @JsonProperty("Description")
+    public void setDescription(String Description) {
+        this.Description = Description;
+    }
+
+}
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Contact.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Contact.java
new file mode 100644
index 00000000000..b0b71a18c53
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Contact.java
@@ -0,0 +1,738 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+
+// CHECKSTYLE:OFF
+/**
+ * Salesforce DTO for SObject Contact
+ */
+public class Contact extends AbstractDescribedSObjectBase {
+
+    public Contact() {
+        getAttributes().setType("Contact");
+    }
+
+    private static final SObjectDescription DESCRIPTION = createSObjectDescription();
+
+    private String MasterRecordId;
+
+    @JsonProperty("MasterRecordId")
+    public String getMasterRecordId() {
+        return this.MasterRecordId;
+    }
+
+    @JsonProperty("MasterRecordId")
+    public void setMasterRecordId(String MasterRecordId) {
+        this.MasterRecordId = MasterRecordId;
+    }
+
+    private Contact MasterRecord;
+
+    @JsonProperty("MasterRecord")
+    public Contact getMasterRecord() {
+        return this.MasterRecord;
+    }
+
+    @JsonProperty("MasterRecord")
+    public void setMasterRecord(Contact MasterRecord) {
+        this.MasterRecord = MasterRecord;
+    }
+
+    private String AccountId;
+
+    @JsonProperty("AccountId")
+    public String getAccountId() {
+        return this.AccountId;
+    }
+
+    @JsonProperty("AccountId")
+    public void setAccountId(String AccountId) {
+        this.AccountId = AccountId;
+    }
+
+    private Account Account;
+
+    @JsonProperty("Account")
+    public Account getAccount() {
+        return this.Account;
+    }
+
+    @JsonProperty("Account")
+    public void setAccount(Account Account) {
+        this.Account = Account;
+    }
+
+    private String LastName;
+
+    @JsonProperty("LastName")
+    public String getLastName() {
+        return this.LastName;
+    }
+
+    @JsonProperty("LastName")
+    public void setLastName(String LastName) {
+        this.LastName = LastName;
+    }
+
+    private String FirstName;
+
+    @JsonProperty("FirstName")
+    public String getFirstName() {
+        return this.FirstName;
+    }
+
+    @JsonProperty("FirstName")
+    public void setFirstName(String FirstName) {
+        this.FirstName = FirstName;
+    }
+
+    private String OtherStreet;
+
+    @JsonProperty("OtherStreet")
+    public String getOtherStreet() {
+        return this.OtherStreet;
+    }
+
+    @JsonProperty("OtherStreet")
+    public void setOtherStreet(String OtherStreet) {
+        this.OtherStreet = OtherStreet;
+    }
+
+    private String OtherCity;
+
+    @JsonProperty("OtherCity")
+    public String getOtherCity() {
+        return this.OtherCity;
+    }
+
+    @JsonProperty("OtherCity")
+    public void setOtherCity(String OtherCity) {
+        this.OtherCity = OtherCity;
+    }
+
+    private String OtherState;
+
+    @JsonProperty("OtherState")
+    public String getOtherState() {
+        return this.OtherState;
+    }
+
+    @JsonProperty("OtherState")
+    public void setOtherState(String OtherState) {
+        this.OtherState = OtherState;
+    }
+
+    private String OtherPostalCode;
+
+    @JsonProperty("OtherPostalCode")
+    public String getOtherPostalCode() {
+        return this.OtherPostalCode;
+    }
+
+    @JsonProperty("OtherPostalCode")
+    public void setOtherPostalCode(String OtherPostalCode) {
+        this.OtherPostalCode = OtherPostalCode;
+    }
+
+    private String OtherCountry;
+
+    @JsonProperty("OtherCountry")
+    public String getOtherCountry() {
+        return this.OtherCountry;
+    }
+
+    @JsonProperty("OtherCountry")
+    public void setOtherCountry(String OtherCountry) {
+        this.OtherCountry = OtherCountry;
+    }
+
+    private Double OtherLatitude;
+
+    @JsonProperty("OtherLatitude")
+    public Double getOtherLatitude() {
+        return this.OtherLatitude;
+    }
+
+    @JsonProperty("OtherLatitude")
+    public void setOtherLatitude(Double OtherLatitude) {
+        this.OtherLatitude = OtherLatitude;
+    }
+
+    private Double OtherLongitude;
+
+    @JsonProperty("OtherLongitude")
+    public Double getOtherLongitude() {
+        return this.OtherLongitude;
+    }
+
+    @JsonProperty("OtherLongitude")
+    public void setOtherLongitude(Double OtherLongitude) {
+        this.OtherLongitude = OtherLongitude;
+    }
+
+    private org.apache.camel.component.salesforce.api.dto.Address OtherAddress;
+
+    @JsonProperty("OtherAddress")
+    public org.apache.camel.component.salesforce.api.dto.Address getOtherAddress() {
+        return this.OtherAddress;
+    }
+
+    @JsonProperty("OtherAddress")
+    public void setOtherAddress(org.apache.camel.component.salesforce.api.dto.Address OtherAddress) {
+        this.OtherAddress = OtherAddress;
+    }
+
+    private String MailingStreet;
+
+    @JsonProperty("MailingStreet")
+    public String getMailingStreet() {
+        return this.MailingStreet;
+    }
+
+    @JsonProperty("MailingStreet")
+    public void setMailingStreet(String MailingStreet) {
+        this.MailingStreet = MailingStreet;
+    }
+
+    private String MailingCity;
+
+    @JsonProperty("MailingCity")
+    public String getMailingCity() {
+        return this.MailingCity;
+    }
+
+    @JsonProperty("MailingCity")
+    public void setMailingCity(String MailingCity) {
+        this.MailingCity = MailingCity;
+    }
+
+    private String MailingState;
+
+    @JsonProperty("MailingState")
+    public String getMailingState() {
+        return this.MailingState;
+    }
+
+    @JsonProperty("MailingState")
+    public void setMailingState(String MailingState) {
+        this.MailingState = MailingState;
+    }
+
+    private String MailingPostalCode;
+
+    @JsonProperty("MailingPostalCode")
+    public String getMailingPostalCode() {
+        return this.MailingPostalCode;
+    }
+
+    @JsonProperty("MailingPostalCode")
+    public void setMailingPostalCode(String MailingPostalCode) {
+        this.MailingPostalCode = MailingPostalCode;
+    }
+
+    private String MailingCountry;
+
+    @JsonProperty("MailingCountry")
+    public String getMailingCountry() {
+        return this.MailingCountry;
+    }
+
+    @JsonProperty("MailingCountry")
+    public void setMailingCountry(String MailingCountry) {
+        this.MailingCountry = MailingCountry;
+    }
+
+    private Double MailingLatitude;
+
+    @JsonProperty("MailingLatitude")
+    public Double getMailingLatitude() {
+        return this.MailingLatitude;
+    }
+
+    @JsonProperty("MailingLatitude")
+    public void setMailingLatitude(Double MailingLatitude) {
+        this.MailingLatitude = MailingLatitude;
+    }
+
+    private Double MailingLongitude;
+
+    @JsonProperty("MailingLongitude")
+    public Double getMailingLongitude() {
+        return this.MailingLongitude;
+    }
+
+    @JsonProperty("MailingLongitude")
+    public void setMailingLongitude(Double MailingLongitude) {
+        this.MailingLongitude = MailingLongitude;
+    }
+
+    private org.apache.camel.component.salesforce.api.dto.Address MailingAddress;
+
+    @JsonProperty("MailingAddress")
+    public org.apache.camel.component.salesforce.api.dto.Address getMailingAddress() {
+        return this.MailingAddress;
+    }
+
+    @JsonProperty("MailingAddress")
+    public void setMailingAddress(org.apache.camel.component.salesforce.api.dto.Address MailingAddress) {
+        this.MailingAddress = MailingAddress;
+    }
+
+    private String Phone;
+
+    @JsonProperty("Phone")
+    public String getPhone() {
+        return this.Phone;
+    }
+
+    @JsonProperty("Phone")
+    public void setPhone(String Phone) {
+        this.Phone = Phone;
+    }
+
+    private String Fax;
+
+    @JsonProperty("Fax")
+    public String getFax() {
+        return this.Fax;
+    }
+
+    @JsonProperty("Fax")
+    public void setFax(String Fax) {
+        this.Fax = Fax;
+    }
+
+    private String MobilePhone;
+
+    @JsonProperty("MobilePhone")
+    public String getMobilePhone() {
+        return this.MobilePhone;
+    }
+
+    @JsonProperty("MobilePhone")
+    public void setMobilePhone(String MobilePhone) {
+        this.MobilePhone = MobilePhone;
+    }
+
+    private String HomePhone;
+
+    @JsonProperty("HomePhone")
+    public String getHomePhone() {
+        return this.HomePhone;
+    }
+
+    @JsonProperty("HomePhone")
+    public void setHomePhone(String HomePhone) {
+        this.HomePhone = HomePhone;
+    }
+
+    private String OtherPhone;
+
+    @JsonProperty("OtherPhone")
+    public String getOtherPhone() {
+        return this.OtherPhone;
+    }
+
+    @JsonProperty("OtherPhone")
+    public void setOtherPhone(String OtherPhone) {
+        this.OtherPhone = OtherPhone;
+    }
+
+    private String AssistantPhone;
+
+    @JsonProperty("AssistantPhone")
+    public String getAssistantPhone() {
+        return this.AssistantPhone;
+    }
+
+    @JsonProperty("AssistantPhone")
+    public void setAssistantPhone(String AssistantPhone) {
+        this.AssistantPhone = AssistantPhone;
+    }
+
+    private String ReportsToId;
+
+    @JsonProperty("ReportsToId")
+    public String getReportsToId() {
+        return this.ReportsToId;
+    }
+
+    @JsonProperty("ReportsToId")
+    public void setReportsToId(String ReportsToId) {
+        this.ReportsToId = ReportsToId;
+    }
+
+    private Contact ReportsTo;
+
+    @JsonProperty("ReportsTo")
+    public Contact getReportsTo() {
+        return this.ReportsTo;
+    }
+
+    @JsonProperty("ReportsTo")
+    public void setReportsTo(Contact ReportsTo) {
+        this.ReportsTo = ReportsTo;
+    }
+
+    private String Email;
+
+    @JsonProperty("Email")
+    public String getEmail() {
+        return this.Email;
+    }
+
+    @JsonProperty("Email")
+    public void setEmail(String Email) {
+        this.Email = Email;
+    }
+
+    private String Title;
+
+    @JsonProperty("Title")
+    public String getTitle() {
+        return this.Title;
+    }
+
+    @JsonProperty("Title")
+    public void setTitle(String Title) {
+        this.Title = Title;
+    }
+
+    private String Department;
+
+    @JsonProperty("Department")
+    public String getDepartment() {
+        return this.Department;
+    }
+
+    @JsonProperty("Department")
+    public void setDepartment(String Department) {
+        this.Department = Department;
+    }
+
+    private String AssistantName;
+
+    @JsonProperty("AssistantName")
+    public String getAssistantName() {
+        return this.AssistantName;
+    }
+
+    @JsonProperty("AssistantName")
+    public void setAssistantName(String AssistantName) {
+        this.AssistantName = AssistantName;
+    }
+
+    private java.time.LocalDate Birthdate;
+
+    @JsonProperty("Birthdate")
+    public java.time.LocalDate getBirthdate() {
+        return this.Birthdate;
+    }
+
+    @JsonProperty("Birthdate")
+    public void setBirthdate(java.time.LocalDate Birthdate) {
+        this.Birthdate = Birthdate;
+    }
+
+    private String Description;
+
+    @JsonProperty("Description")
+    public String getDescription() {
+        return this.Description;
+    }
+
+    @JsonProperty("Description")
+    public void setDescription(String Description) {
+        this.Description = Description;
+    }
+
+    private java.time.ZonedDateTime LastCURequestDate;
+
+    @JsonProperty("LastCURequestDate")
+    public java.time.ZonedDateTime getLastCURequestDate() {
+        return this.LastCURequestDate;
+    }
+
+    @JsonProperty("LastCURequestDate")
+    public void setLastCURequestDate(java.time.ZonedDateTime LastCURequestDate) {
+        this.LastCURequestDate = LastCURequestDate;
+    }
+
+    private java.time.ZonedDateTime LastCUUpdateDate;
+
+    @JsonProperty("LastCUUpdateDate")
+    public java.time.ZonedDateTime getLastCUUpdateDate() {
+        return this.LastCUUpdateDate;
+    }
+
+    @JsonProperty("LastCUUpdateDate")
+    public void setLastCUUpdateDate(java.time.ZonedDateTime LastCUUpdateDate) {
+        this.LastCUUpdateDate = LastCUUpdateDate;
+    }
+
+    private String EmailBouncedReason;
+
+    @JsonProperty("EmailBouncedReason")
+    public String getEmailBouncedReason() {
+        return this.EmailBouncedReason;
+    }
+
+    @JsonProperty("EmailBouncedReason")
+    public void setEmailBouncedReason(String EmailBouncedReason) {
+        this.EmailBouncedReason = EmailBouncedReason;
+    }
+
+    private java.time.ZonedDateTime EmailBouncedDate;
+
+    @JsonProperty("EmailBouncedDate")
+    public java.time.ZonedDateTime getEmailBouncedDate() {
+        return this.EmailBouncedDate;
+    }
+
+    @JsonProperty("EmailBouncedDate")
+    public void setEmailBouncedDate(java.time.ZonedDateTime EmailBouncedDate) {
+        this.EmailBouncedDate = EmailBouncedDate;
+    }
+
+    private Boolean IsEmailBounced;
+
+    @JsonProperty("IsEmailBounced")
+    public Boolean getIsEmailBounced() {
+        return this.IsEmailBounced;
+    }
+
+    @JsonProperty("IsEmailBounced")
+    public void setIsEmailBounced(Boolean IsEmailBounced) {
+        this.IsEmailBounced = IsEmailBounced;
+    }
+
+    private String PhotoUrl;
+
+    @JsonProperty("PhotoUrl")
+    public String getPhotoUrl() {
+        return this.PhotoUrl;
+    }
+
+    @JsonProperty("PhotoUrl")
+    public void setPhotoUrl(String PhotoUrl) {
+        this.PhotoUrl = PhotoUrl;
+    }
+
+    private String Jigsaw;
+
+    @JsonProperty("Jigsaw")
+    public String getJigsaw() {
+        return this.Jigsaw;
+    }
+
+    @JsonProperty("Jigsaw")
+    public void setJigsaw(String Jigsaw) {
+        this.Jigsaw = Jigsaw;
+    }
+
+    private String JigsawContactId;
+
+    @JsonProperty("JigsawContactId")
+    public String getJigsawContactId() {
+        return this.JigsawContactId;
+    }
+
+    @JsonProperty("JigsawContactId")
+    public void setJigsawContactId(String JigsawContactId) {
+        this.JigsawContactId = JigsawContactId;
+    }
+
+    private String External_Id__c;
+
+    @JsonProperty("External_Id__c")
+    public String getExternal_Id__c() {
+        return this.External_Id__c;
+    }
+
+    @JsonProperty("External_Id__c")
+    public void setExternal_Id__c(String External_Id__c) {
+        this.External_Id__c = External_Id__c;
+    }
+
+    @Override
+    public final SObjectDescription description() {
+        return DESCRIPTION;
+    }
+
+    private static SObjectDescription createSObjectDescription() {
+        final SObjectDescription description = new SObjectDescription();
+
+        final List<SObjectField> fields1 = new ArrayList<>();
+        description.setFields(fields1);
+
+        final SObjectField sObjectField1 = createField("Id", "Contact ID", "id", "tns:ID", 18, false, false, false, false, false, false, true);
+        fields1.add(sObjectField1);
+        final SObjectField sObjectField2 = createField("IsDeleted", "Deleted", "boolean", "xsd:boolean", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField2);
+        final SObjectField sObjectField3 = createField("MasterRecordId", "Master Record ID", "reference", "tns:ID", 18, false, true, false, false, false, false, false);
+        fields1.add(sObjectField3);
+        final SObjectField sObjectField4 = createField("AccountId", "Account ID", "reference", "tns:ID", 18, false, true, false, false, false, false, false);
+        fields1.add(sObjectField4);
+        final SObjectField sObjectField5 = createField("LastName", "Last Name", "string", "xsd:string", 80, false, false, false, false, false, false, false);
+        fields1.add(sObjectField5);
+        final SObjectField sObjectField6 = createField("FirstName", "First Name", "string", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField6);
+        final SObjectField sObjectField7 = createField("Salutation", "Salutation", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField7);
+        final SObjectField sObjectField8 = createField("Name", "Full Name", "string", "xsd:string", 121, false, false, true, false, false, false, false);
+        fields1.add(sObjectField8);
+        final SObjectField sObjectField9 = createField("OtherStreet", "Other Street", "textarea", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField9);
+        final SObjectField sObjectField10 = createField("OtherCity", "Other City", "string", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField10);
+        final SObjectField sObjectField11 = createField("OtherState", "Other State/Province", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField11);
+        final SObjectField sObjectField12 = createField("OtherPostalCode", "Other Zip/Postal Code", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField12);
+        final SObjectField sObjectField13 = createField("OtherCountry", "Other Country", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField13);
+        final SObjectField sObjectField14 = createField("OtherLatitude", "Other Latitude", "double", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField14);
+        final SObjectField sObjectField15 = createField("OtherLongitude", "Other Longitude", "double", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField15);
+        final SObjectField sObjectField16 = createField("OtherGeocodeAccuracy", "Other Geocode Accuracy", "picklist", "xsd:string", 40, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField16);
+        final SObjectField sObjectField17 = createField("OtherAddress", "Other Address", "address", "urn:address", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField17);
+        final SObjectField sObjectField18 = createField("MailingStreet", "Mailing Street", "textarea", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField18);
+        final SObjectField sObjectField19 = createField("MailingCity", "Mailing City", "string", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField19);
+        final SObjectField sObjectField20 = createField("MailingState", "Mailing State/Province", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField20);
+        final SObjectField sObjectField21 = createField("MailingPostalCode", "Mailing Zip/Postal Code", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField21);
+        final SObjectField sObjectField22 = createField("MailingCountry", "Mailing Country", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField22);
+        final SObjectField sObjectField23 = createField("MailingLatitude", "Mailing Latitude", "double", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField23);
+        final SObjectField sObjectField24 = createField("MailingLongitude", "Mailing Longitude", "double", "xsd:double", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField24);
+        final SObjectField sObjectField25 = createField("MailingGeocodeAccuracy", "Mailing Geocode Accuracy", "picklist", "xsd:string", 40, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField25);
+        final SObjectField sObjectField26 = createField("MailingAddress", "Mailing Address", "address", "urn:address", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField26);
+        final SObjectField sObjectField27 = createField("Phone", "Business Phone", "phone", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField27);
+        final SObjectField sObjectField28 = createField("Fax", "Business Fax", "phone", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField28);
+        final SObjectField sObjectField29 = createField("MobilePhone", "Mobile Phone", "phone", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField29);
+        final SObjectField sObjectField30 = createField("HomePhone", "Home Phone", "phone", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField30);
+        final SObjectField sObjectField31 = createField("OtherPhone", "Other Phone", "phone", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField31);
+        final SObjectField sObjectField32 = createField("AssistantPhone", "Asst. Phone", "phone", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField32);
+        final SObjectField sObjectField33 = createField("ReportsToId", "Reports To ID", "reference", "tns:ID", 18, false, true, false, false, false, false, false);
+        fields1.add(sObjectField33);
+        final SObjectField sObjectField34 = createField("Email", "Email", "email", "xsd:string", 80, false, true, false, false, false, false, true);
+        fields1.add(sObjectField34);
+        final SObjectField sObjectField35 = createField("Title", "Title", "string", "xsd:string", 128, false, true, false, false, false, false, false);
+        fields1.add(sObjectField35);
+        final SObjectField sObjectField36 = createField("Department", "Department", "string", "xsd:string", 80, false, true, false, false, false, false, false);
+        fields1.add(sObjectField36);
+        final SObjectField sObjectField37 = createField("AssistantName", "Assistant's Name", "string", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField37);
+        final SObjectField sObjectField38 = createField("LeadSource", "Lead Source", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField38);
+        final SObjectField sObjectField39 = createField("Birthdate", "Birthdate", "date", "xsd:date", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField39);
+        final SObjectField sObjectField40 = createField("Description", "Contact Description", "textarea", "xsd:string", 32000, false, true, false, false, false, false, false);
+        fields1.add(sObjectField40);
+        final SObjectField sObjectField41 = createField("OwnerId", "Owner ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField41);
+        final SObjectField sObjectField42 = createField("CreatedDate", "Created Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField42);
+        final SObjectField sObjectField43 = createField("CreatedById", "Created By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField43);
+        final SObjectField sObjectField44 = createField("LastModifiedDate", "Last Modified Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField44);
+        final SObjectField sObjectField45 = createField("LastModifiedById", "Last Modified By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField45);
+        final SObjectField sObjectField46 = createField("SystemModstamp", "System Modstamp", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField46);
+        final SObjectField sObjectField47 = createField("LastActivityDate", "Last Activity", "date", "xsd:date", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField47);
+        final SObjectField sObjectField48 = createField("LastCURequestDate", "Last Stay-in-Touch Request Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false,
+                                                        false, false);
+        fields1.add(sObjectField48);
+        final SObjectField sObjectField49 = createField("LastCUUpdateDate", "Last Stay-in-Touch Save Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField49);
+        final SObjectField sObjectField50 = createField("LastViewedDate", "Last Viewed Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField50);
+        final SObjectField sObjectField51 = createField("LastReferencedDate", "Last Referenced Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField51);
+        final SObjectField sObjectField52 = createField("EmailBouncedReason", "Email Bounced Reason", "string", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField52);
+        final SObjectField sObjectField53 = createField("EmailBouncedDate", "Email Bounced Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField53);
+        final SObjectField sObjectField54 = createField("IsEmailBounced", "Is Email Bounced", "boolean", "xsd:boolean", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField54);
+        final SObjectField sObjectField55 = createField("PhotoUrl", "Photo URL", "url", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField55);
+        final SObjectField sObjectField56 = createField("Jigsaw", "Data.com Key", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField56);
+        final SObjectField sObjectField57 = createField("JigsawContactId", "Jigsaw Contact ID", "string", "xsd:string", 20, false, true, false, false, false, false, false);
+        fields1.add(sObjectField57);
+        final SObjectField sObjectField58 = createField("CleanStatus", "Clean Status", "picklist", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField58);
+        final SObjectField sObjectField59 = createField("External_Id__c", "External Id", "string", "xsd:string", 255, true, true, false, true, true, false, true);
+        fields1.add(sObjectField59);
+
+        description.setLabel("Contact");
+        description.setLabelPlural("Contacts");
+        description.setName("Contact");
+
+        final SObjectDescriptionUrls sObjectDescriptionUrls1 = new SObjectDescriptionUrls();
+        sObjectDescriptionUrls1.setApprovalLayouts("/services/data/v45.0/sobjects/Contact/describe/approvalLayouts");
+        sObjectDescriptionUrls1.setCompactLayouts("/services/data/v45.0/sobjects/Contact/describe/compactLayouts");
+        sObjectDescriptionUrls1.setDefaultValues("/services/data/v45.0/sobjects/Contact/defaultValues?recordTypeId&fields");
+        sObjectDescriptionUrls1.setDescribe("/services/data/v45.0/sobjects/Contact/describe");
+        sObjectDescriptionUrls1.setLayouts("/services/data/v45.0/sobjects/Contact/describe/layouts");
+        sObjectDescriptionUrls1.setListviews("/services/data/v45.0/sobjects/Contact/listviews");
+        sObjectDescriptionUrls1.setQuickActions("/services/data/v45.0/sobjects/Contact/quickActions");
+        sObjectDescriptionUrls1.setRowTemplate("/services/data/v45.0/sobjects/Contact/{ID}");
+        sObjectDescriptionUrls1.setSobject("/services/data/v45.0/sobjects/Contact");
+        sObjectDescriptionUrls1.setUiDetailTemplate("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/{ID}");
+        sObjectDescriptionUrls1.setUiEditTemplate("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/{ID}/e");
+        sObjectDescriptionUrls1.setUiNewRecord("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/003/e");
+        description.setUrls(sObjectDescriptionUrls1);
+
+        return description;
+    }
+}
+
+// CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Document.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Document.java
new file mode 100644
index 00000000000..38239403b66
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Document.java
@@ -0,0 +1,286 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+
+//CHECKSTYLE:OFF
+/**
+ * Salesforce DTO for SObject Document
+ */
+public class Document extends AbstractDescribedSObjectBase {
+
+    public Document() {
+        getAttributes().setType("Document");
+    }
+
+    private static final SObjectDescription DESCRIPTION = createSObjectDescription();
+
+    private String FolderId;
+
+    @JsonProperty("FolderId")
+    public String getFolderId() {
+        return this.FolderId;
+    }
+
+    @JsonProperty("FolderId")
+    public void setFolderId(String FolderId) {
+        this.FolderId = FolderId;
+    }
+
+    private String DeveloperName;
+
+    @JsonProperty("DeveloperName")
+    public String getDeveloperName() {
+        return this.DeveloperName;
+    }
+
+    @JsonProperty("DeveloperName")
+    public void setDeveloperName(String DeveloperName) {
+        this.DeveloperName = DeveloperName;
+    }
+
+    private String NamespacePrefix;
+
+    @JsonProperty("NamespacePrefix")
+    public String getNamespacePrefix() {
+        return this.NamespacePrefix;
+    }
+
+    @JsonProperty("NamespacePrefix")
+    public void setNamespacePrefix(String NamespacePrefix) {
+        this.NamespacePrefix = NamespacePrefix;
+    }
+
+    private String ContentType;
+
+    @JsonProperty("ContentType")
+    public String getContentType() {
+        return this.ContentType;
+    }
+
+    @JsonProperty("ContentType")
+    public void setContentType(String ContentType) {
+        this.ContentType = ContentType;
+    }
+
+    private String Type;
+
+    @JsonProperty("Type")
+    public String getType() {
+        return this.Type;
+    }
+
+    @JsonProperty("Type")
+    public void setType(String Type) {
+        this.Type = Type;
+    }
+
+    private Boolean IsPublic;
+
+    @JsonProperty("IsPublic")
+    public Boolean getIsPublic() {
+        return this.IsPublic;
+    }
+
+    @JsonProperty("IsPublic")
+    public void setIsPublic(Boolean IsPublic) {
+        this.IsPublic = IsPublic;
+    }
+
+    private Integer BodyLength;
+
+    @JsonProperty("BodyLength")
+    public Integer getBodyLength() {
+        return this.BodyLength;
+    }
+
+    @JsonProperty("BodyLength")
+    public void setBodyLength(Integer BodyLength) {
+        this.BodyLength = BodyLength;
+    }
+
+    // blob field url, use getBlobField to get the content
+    private String BodyUrl;
+
+    @JsonProperty("Body")
+    public String getBodyUrl() {
+        return this.BodyUrl;
+    }
+
+    @JsonProperty("Body")
+    public void setBodyUrl(String BodyUrl) {
+        this.BodyUrl = BodyUrl;
+    }
+
+    private String Url;
+
+    @JsonProperty("Url")
+    public String getUrl() {
+        return this.Url;
+    }
+
+    @JsonProperty("Url")
+    public void setUrl(String Url) {
+        this.Url = Url;
+    }
+
+    private String Description;
+
+    @JsonProperty("Description")
+    public String getDescription() {
+        return this.Description;
+    }
+
+    @JsonProperty("Description")
+    public void setDescription(String Description) {
+        this.Description = Description;
+    }
+
+    private String Keywords;
+
+    @JsonProperty("Keywords")
+    public String getKeywords() {
+        return this.Keywords;
+    }
+
+    @JsonProperty("Keywords")
+    public void setKeywords(String Keywords) {
+        this.Keywords = Keywords;
+    }
+
+    private Boolean IsInternalUseOnly;
+
+    @JsonProperty("IsInternalUseOnly")
+    public Boolean getIsInternalUseOnly() {
+        return this.IsInternalUseOnly;
+    }
+
+    @JsonProperty("IsInternalUseOnly")
+    public void setIsInternalUseOnly(Boolean IsInternalUseOnly) {
+        this.IsInternalUseOnly = IsInternalUseOnly;
+    }
+
+    private String AuthorId;
+
+    @JsonProperty("AuthorId")
+    public String getAuthorId() {
+        return this.AuthorId;
+    }
+
+    @JsonProperty("AuthorId")
+    public void setAuthorId(String AuthorId) {
+        this.AuthorId = AuthorId;
+    }
+
+    private Boolean IsBodySearchable;
+
+    @JsonProperty("IsBodySearchable")
+    public Boolean getIsBodySearchable() {
+        return this.IsBodySearchable;
+    }
+
+    @JsonProperty("IsBodySearchable")
+    public void setIsBodySearchable(Boolean IsBodySearchable) {
+        this.IsBodySearchable = IsBodySearchable;
+    }
+
+    @Override
+    public final SObjectDescription description() {
+        return DESCRIPTION;
+    }
+
+    private static SObjectDescription createSObjectDescription() {
+        final SObjectDescription description = new SObjectDescription();
+
+        final List<SObjectField> fields1 = new ArrayList<>();
+        description.setFields(fields1);
+
+        final SObjectField sObjectField1 = createField("Id", "Document ID", "id", "tns:ID", 18, false, false, false, false, false, false, true);
+        fields1.add(sObjectField1);
+        final SObjectField sObjectField2 = createField("FolderId", "Folder ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField2);
+        final SObjectField sObjectField3 = createField("IsDeleted", "Deleted", "boolean", "xsd:boolean", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField3);
+        final SObjectField sObjectField4 = createField("Name", "Document Name", "string", "xsd:string", 255, false, false, true, false, false, false, true);
+        fields1.add(sObjectField4);
+        final SObjectField sObjectField5 = createField("DeveloperName", "Document Unique Name", "string", "xsd:string", 80, false, false, false, false, false, false, false);
+        fields1.add(sObjectField5);
+        final SObjectField sObjectField6 = createField("NamespacePrefix", "Namespace Prefix", "string", "xsd:string", 15, false, true, false, false, false, false, false);
+        fields1.add(sObjectField6);
+        final SObjectField sObjectField7 = createField("ContentType", "MIME Type", "string", "xsd:string", 120, false, true, false, false, false, false, false);
+        fields1.add(sObjectField7);
+        final SObjectField sObjectField8 = createField("Type", "File Extension", "string", "xsd:string", 40, false, true, false, false, false, false, false);
+        fields1.add(sObjectField8);
+        final SObjectField sObjectField9 = createField("IsPublic", "Externally Available", "boolean", "xsd:boolean", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField9);
+        final SObjectField sObjectField10 = createField("BodyLength", "Body Length", "int", "xsd:int", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField10);
+        final SObjectField sObjectField11 = createField("Body", "Body", "base64", "xsd:base64Binary", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField11);
+        final SObjectField sObjectField12 = createField("Url", "Url", "string", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField12);
+        final SObjectField sObjectField13 = createField("Description", "Description", "textarea", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField13);
+        final SObjectField sObjectField14 = createField("Keywords", "Keywords", "string", "xsd:string", 255, false, true, false, false, false, false, false);
+        fields1.add(sObjectField14);
+        final SObjectField sObjectField15 = createField("IsInternalUseOnly", "Internal Use Only", "boolean", "xsd:boolean", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField15);
+        final SObjectField sObjectField16 = createField("AuthorId", "Author ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField16);
+        final SObjectField sObjectField17 = createField("CreatedDate", "Created Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField17);
+        final SObjectField sObjectField18 = createField("CreatedById", "Created By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField18);
+        final SObjectField sObjectField19 = createField("LastModifiedDate", "Last Modified Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField19);
+        final SObjectField sObjectField20 = createField("LastModifiedById", "Last Modified By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField20);
+        final SObjectField sObjectField21 = createField("SystemModstamp", "System Modstamp", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField21);
+        final SObjectField sObjectField22 = createField("IsBodySearchable", "Document Content Searchable", "boolean", "xsd:boolean", 0, false, false, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField22);
+        final SObjectField sObjectField23 = createField("LastViewedDate", "Last Viewed Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField23);
+        final SObjectField sObjectField24 = createField("LastReferencedDate", "Last Referenced Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField24);
+
+        description.setLabel("Document");
+        description.setLabelPlural("Documents");
+        description.setName("Document");
+
+        final SObjectDescriptionUrls sObjectDescriptionUrls1 = new SObjectDescriptionUrls();
+        sObjectDescriptionUrls1.setDefaultValues("/services/data/v45.0/sobjects/Document/defaultValues?recordTypeId&fields");
+        sObjectDescriptionUrls1.setDescribe("/services/data/v45.0/sobjects/Document/describe");
+        sObjectDescriptionUrls1.setRowTemplate("/services/data/v45.0/sobjects/Document/{ID}");
+        sObjectDescriptionUrls1.setSobject("/services/data/v45.0/sobjects/Document");
+        description.setUrls(sObjectDescriptionUrls1);
+
+        return description;
+    }
+}
+
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Line_Item__c.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Line_Item__c.java
new file mode 100644
index 00000000000..42d23820af4
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Line_Item__c.java
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
+import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+import org.apache.camel.component.salesforce.api.utils.AsNestedPropertyResolver;
+
+//CHECKSTYLE:OFF
+public class Line_Item__c extends AbstractDescribedSObjectBase {
+
+    @JsonTypeResolver(AsNestedPropertyResolver.class)
+    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "attributes.type",
+        defaultImpl = AbstractDescribedSObjectBase.class)
+    @JsonSubTypes({
+            @JsonSubTypes.Type(value = User.class, name = "User")
+    })
+    private AbstractSObjectBase Owner;
+
+    @JsonProperty("Owner")
+    public AbstractSObjectBase getOwner() {
+        return Owner;
+    }
+
+    @JsonProperty("Owner")
+    public void setOwner(AbstractSObjectBase owner) {
+        Owner = owner;
+    }
+
+    public Line_Item__c() {
+        getAttributes().setType("Line_Item__c");
+    }
+
+    private static final SObjectDescription DESCRIPTION = createSObjectDescription();
+
+    private String Merchandise__c;
+
+    @JsonProperty("Merchandise__c")
+    public String getMerchandise__c() {
+        return this.Merchandise__c;
+    }
+
+    @JsonProperty("Merchandise__c")
+    public void setMerchandise__c(String Merchandise__c) {
+        this.Merchandise__c = Merchandise__c;
+    }
+
+    private Double Unit_Price__c;
+
+    @JsonProperty("Unit_Price__c")
+    public Double getUnit_Price__c() {
+        return this.Unit_Price__c;
+    }
+
+    @JsonProperty("Unit_Price__c")
+    public void setUnit_Price__c(Double Unit_Price__c) {
+        this.Unit_Price__c = Unit_Price__c;
+    }
+
+    private Double Units_Sold__c;
+
+    @JsonProperty("Units_Sold__c")
+    public Double getUnits_Sold__c() {
+        return this.Units_Sold__c;
+    }
+
+    @JsonProperty("Units_Sold__c")
+    public void setUnits_Sold__c(Double Units_Sold__c) {
+        this.Units_Sold__c = Units_Sold__c;
+    }
+
+    private RecordType RecordType;
+
+    @JsonProperty("RecordType")
+    public RecordType getRecordType() {
+        return this.RecordType;
+    }
+
+    @JsonProperty("RecordType")
+    public void setRecordType(RecordType RecordType) {
+        this.RecordType = RecordType;
+    }
+
+
+    @Override
+    public final SObjectDescription description() {
+        return DESCRIPTION;
+    }
+
+    private static SObjectDescription createSObjectDescription() {
+        final SObjectDescription description = new SObjectDescription();
+
+        final List<SObjectField> fields1 = new ArrayList<>();
+        description.setFields(fields1);
+
+        final SObjectField sObjectField1 = createField("Id", "Record ID", "id", "tns:ID", 18, false, false, false, false, false, false, true);
+        fields1.add(sObjectField1);
+        final SObjectField sObjectField2 = createField("OwnerId", "Owner ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField2);
+        final SObjectField sObjectField3 = createField("IsDeleted", "Deleted", "boolean", "xsd:boolean", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField3);
+        final SObjectField sObjectField4 = createField("Name", "Line Item Number", "string", "xsd:string", 80, false, true, true, false, false, false, true);
+        fields1.add(sObjectField4);
+        final SObjectField sObjectField5 = createField("CreatedDate", "Created Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField5);
+        final SObjectField sObjectField6 = createField("CreatedById", "Created By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField6);
+        final SObjectField sObjectField7 = createField("LastModifiedDate", "Last Modified Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField7);
+        final SObjectField sObjectField8 = createField("LastModifiedById", "Last Modified By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField8);
+        final SObjectField sObjectField9 = createField("SystemModstamp", "System Modstamp", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField9);
+        final SObjectField sObjectField10 = createField("Merchandise__c", "Merchandise", "reference", "tns:ID", 18, false, true, false, false, true, false, false);
+        fields1.add(sObjectField10);
+        final SObjectField sObjectField11 = createField("Unit_Price__c", "Unit Price", "currency", "xsd:double", 0, false, true, false, false, true, false, false);
+        fields1.add(sObjectField11);
+        final SObjectField sObjectField12 = createField("Units_Sold__c", "Units Sold", "double", "xsd:double", 0, false, true, false, false, true, false, false);
+        fields1.add(sObjectField12);
+
+        description.setLabel("Line Item");
+        description.setLabelPlural("Line Items");
+        description.setName("Line_Item__c");
+
+        final SObjectDescriptionUrls sObjectDescriptionUrls1 = new SObjectDescriptionUrls();
+        sObjectDescriptionUrls1.setApprovalLayouts("/services/data/v45.0/sobjects/Line_Item__c/describe/approvalLayouts");
+        sObjectDescriptionUrls1.setCompactLayouts("/services/data/v45.0/sobjects/Line_Item__c/describe/compactLayouts");
+        sObjectDescriptionUrls1.setDefaultValues("/services/data/v45.0/sobjects/Line_Item__c/defaultValues?recordTypeId&fields");
+        sObjectDescriptionUrls1.setDescribe("/services/data/v45.0/sobjects/Line_Item__c/describe");
+        sObjectDescriptionUrls1.setLayouts("/services/data/v45.0/sobjects/Line_Item__c/describe/layouts");
+        sObjectDescriptionUrls1.setQuickActions("/services/data/v45.0/sobjects/Line_Item__c/quickActions");
+        sObjectDescriptionUrls1.setRowTemplate("/services/data/v45.0/sobjects/Line_Item__c/{ID}");
+        sObjectDescriptionUrls1.setSobject("/services/data/v45.0/sobjects/Line_Item__c");
+        sObjectDescriptionUrls1.setUiDetailTemplate("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/{ID}");
+        sObjectDescriptionUrls1.setUiEditTemplate("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/{ID}/e");
+        sObjectDescriptionUrls1.setUiNewRecord("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/a01/e");
+        description.setUrls(sObjectDescriptionUrls1);
+
+        return description;
+    }
+}
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/MSPTest.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/MSPTest.java
new file mode 100644
index 00000000000..d4966234b09
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/MSPTest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.apache.camel.component.salesforce.api.MultiSelectPicklistDeserializer;
+import org.apache.camel.component.salesforce.api.MultiSelectPicklistSerializer;
+import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
+
+/**
+ * Sample POJO for MSP tests.
+ */
+//CHECKSTYLE:OFF
+public class MSPTest extends AbstractSObjectBase {
+
+    public MSPTest() {
+        getAttributes().setType("MSPTest");
+    }
+
+    private MSPEnum[] MspField;
+
+    @JsonProperty("MspField")
+    @JsonSerialize(using = MultiSelectPicklistSerializer.class)
+    @JsonInclude(value = Include.ALWAYS)
+    public MSPEnum[] getMspField() {
+        return MspField;
+    }
+
+    @JsonProperty("MspField")
+    @JsonDeserialize(using = MultiSelectPicklistDeserializer.class)
+    public void setMspField(MSPEnum[] mspField) {
+        this.MspField = mspField;
+    }
+
+    @JsonDeserialize
+    public enum MSPEnum {
+
+        // Value1
+        VALUE1("Value1"),
+        // Value1
+        VALUE2("Value2"),
+        // Value1
+        VALUE3("Value3");
+
+        final String value;
+
+        private MSPEnum(String value) {
+            this.value = value;
+        }
+
+        @JsonValue
+        public String value() {
+            return this.value;
+        }
+
+        @JsonCreator
+        public static MSPEnum fromValue(String value) {
+            for (MSPEnum e : MSPEnum.values()) {
+                if (e.value.equals(value)) {
+                    return e;
+                }
+            }
+            throw new IllegalArgumentException(value);
+        }
+    }
+}
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Merchandise__c.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Merchandise__c.java
new file mode 100644
index 00000000000..68190a7d98b
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Merchandise__c.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+
+//CHECKSTYLE:OFF
+public class Merchandise__c extends AbstractDescribedSObjectBase {
+
+    public Merchandise__c() {
+        getAttributes().setType("Merchandise__c");
+    }
+
+    private static final SObjectDescription DESCRIPTION = createSObjectDescription();
+
+    private String Description__c;
+
+    @JsonProperty("Description__c")
+    public String getDescription__c() {
+        return this.Description__c;
+    }
+
+    @JsonProperty("Description__c")
+    public void setDescription__c(String Description__c) {
+        this.Description__c = Description__c;
+    }
+
+    private Double Price__c;
+
+    @JsonProperty("Price__c")
+    public Double getPrice__c() {
+        return this.Price__c;
+    }
+
+    @JsonProperty("Price__c")
+    public void setPrice__c(Double Price__c) {
+        this.Price__c = Price__c;
+    }
+
+    private Double Total_Inventory__c;
+
+    @JsonProperty("Total_Inventory__c")
+    public Double getTotal_Inventory__c() {
+        return this.Total_Inventory__c;
+    }
+
+    @JsonProperty("Total_Inventory__c")
+    public void setTotal_Inventory__c(Double Total_Inventory__c) {
+        this.Total_Inventory__c = Total_Inventory__c;
+    }
+
+    private QueryRecordsLine_Item__c Line_Items__r;
+
+    @JsonProperty("Line_Items__r")
+    public QueryRecordsLine_Item__c getLine_Items__r() {
+        return Line_Items__r;
+    }
+
+    @JsonProperty("Line_Items__r")
+    public void setLine_Items__r(QueryRecordsLine_Item__c Line_Items__r) {
+        this.Line_Items__r = Line_Items__r;
+    }
+
+    @Override
+    public final SObjectDescription description() {
+        return DESCRIPTION;
+    }
+
+    private static SObjectDescription createSObjectDescription() {
+        final SObjectDescription description = new SObjectDescription();
+
+        final List<SObjectField> fields1 = new ArrayList<>();
+        description.setFields(fields1);
+
+        final SObjectField sObjectField1 = createField("Id", "Record ID", "id", "tns:ID", 18, false, false, false, false, false, false, true);
+        fields1.add(sObjectField1);
+        final SObjectField sObjectField2 = createField("OwnerId", "Owner ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField2);
+        final SObjectField sObjectField3 = createField("IsDeleted", "Deleted", "boolean", "xsd:boolean", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField3);
+        final SObjectField sObjectField4 = createField("Name", "Merchandise Name", "string", "xsd:string", 80, false, true, true, false, false, false, true);
+        fields1.add(sObjectField4);
+        final SObjectField sObjectField5 = createField("CreatedDate", "Created Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField5);
+        final SObjectField sObjectField6 = createField("CreatedById", "Created By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField6);
+        final SObjectField sObjectField7 = createField("LastModifiedDate", "Last Modified Date", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField7);
+        final SObjectField sObjectField8 = createField("LastModifiedById", "Last Modified By ID", "reference", "tns:ID", 18, false, false, false, false, false, false, false);
+        fields1.add(sObjectField8);
+        final SObjectField sObjectField9 = createField("SystemModstamp", "System Modstamp", "datetime", "xsd:dateTime", 0, false, false, false, false, false, false, false);
+        fields1.add(sObjectField9);
+        final SObjectField sObjectField10 = createField("LastActivityDate", "Last Activity Date", "date", "xsd:date", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField10);
+        final SObjectField sObjectField11 = createField("LastViewedDate", "Last Viewed Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false, false);
+        fields1.add(sObjectField11);
+        final SObjectField sObjectField12 = createField("LastReferencedDate", "Last Referenced Date", "datetime", "xsd:dateTime", 0, false, true, false, false, false, false,
+                                                        false);
+        fields1.add(sObjectField12);
+        final SObjectField sObjectField13 = createField("Description__c", "Description", "string", "xsd:string", 100, false, true, false, false, true, false, false);
+        fields1.add(sObjectField13);
+        final SObjectField sObjectField14 = createField("Price__c", "Price", "currency", "xsd:double", 0, false, false, false, false, true, false, false);
+        fields1.add(sObjectField14);
+        final SObjectField sObjectField15 = createField("Total_Inventory__c", "Total_Inventory", "double", "xsd:double", 0, false, false, false, false, true, false, false);
+        fields1.add(sObjectField15);
+
+        description.setLabel("Merchandise");
+        description.setLabelPlural("Merchandise");
+        description.setName("Merchandise__c");
+
+        final SObjectDescriptionUrls sObjectDescriptionUrls1 = new SObjectDescriptionUrls();
+        sObjectDescriptionUrls1.setApprovalLayouts("/services/data/v45.0/sobjects/Merchandise__c/describe/approvalLayouts");
+        sObjectDescriptionUrls1.setCompactLayouts("/services/data/v45.0/sobjects/Merchandise__c/describe/compactLayouts");
+        sObjectDescriptionUrls1.setDefaultValues("/services/data/v45.0/sobjects/Merchandise__c/defaultValues?recordTypeId&fields");
+        sObjectDescriptionUrls1.setDescribe("/services/data/v45.0/sobjects/Merchandise__c/describe");
+        sObjectDescriptionUrls1.setLayouts("/services/data/v45.0/sobjects/Merchandise__c/describe/layouts");
+        sObjectDescriptionUrls1.setQuickActions("/services/data/v45.0/sobjects/Merchandise__c/quickActions");
+        sObjectDescriptionUrls1.setRowTemplate("/services/data/v45.0/sobjects/Merchandise__c/{ID}");
+        sObjectDescriptionUrls1.setSobject("/services/data/v45.0/sobjects/Merchandise__c");
+        sObjectDescriptionUrls1.setUiDetailTemplate("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/{ID}");
+        sObjectDescriptionUrls1.setUiEditTemplate("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/{ID}/e");
+        sObjectDescriptionUrls1.setUiNewRecord("https://customer-flow-8168-dev-ed.cs42.my.salesforce.com/a02/e");
+        description.setUrls(sObjectDescriptionUrls1);
+
+        return description;
+    }
+}
+
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsAccount.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsAccount.java
new file mode 100644
index 00000000000..da270b4dd49
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsAccount.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import org.apache.camel.component.salesforce.api.dto.AbstractQueryRecordsBase;
+
+public class QueryRecordsAccount extends AbstractQueryRecordsBase<Account> {
+}
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsContact.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsContact.java
new file mode 100644
index 00000000000..4ecdebd08e1
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsContact.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import org.apache.camel.component.salesforce.api.dto.AbstractQueryRecordsBase;
+
+public class QueryRecordsContact extends AbstractQueryRecordsBase<Contact> {
+}
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsLine_Item__c.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsLine_Item__c.java
new file mode 100644
index 00000000000..d4584a9afd0
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/QueryRecordsLine_Item__c.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import org.apache.camel.component.salesforce.api.dto.AbstractQueryRecordsBase;
+
+//CHECKSTYLE:OFF
+public class QueryRecordsLine_Item__c extends AbstractQueryRecordsBase<Line_Item__c> {
+}
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/RecordType.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/RecordType.java
new file mode 100644
index 00000000000..d8a66e2d573
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/RecordType.java
@@ -0,0 +1,188 @@
+/*
+ * Salesforce DTO generated by camel-salesforce-maven-plugin.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+
+/**
+ * Salesforce DTO for SObject RecordType
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public class RecordType extends AbstractDescribedSObjectBase {
+
+    public RecordType() {
+        getAttributes().setType("RecordType");
+    }
+
+    private static final SObjectDescription DESCRIPTION = createSObjectDescription();
+
+    private String DeveloperName;
+
+    @JsonProperty("DeveloperName")
+    public String getDeveloperName() {
+        return this.DeveloperName;
+    }
+
+    @JsonProperty("DeveloperName")
+    public void setDeveloperName(String DeveloperName) {
+        this.DeveloperName = DeveloperName;
+    }
+
+    private String NamespacePrefix;
+
+    @JsonProperty("NamespacePrefix")
+    public String getNamespacePrefix() {
+        return this.NamespacePrefix;
+    }
+
+    @JsonProperty("NamespacePrefix")
+    public void setNamespacePrefix(String NamespacePrefix) {
+        this.NamespacePrefix = NamespacePrefix;
+    }
+
+    private String Description;
+
+    @JsonProperty("Description")
+    public String getDescription() {
+        return this.Description;
+    }
+
+    @JsonProperty("Description")
+    public void setDescription(String Description) {
+        this.Description = Description;
+    }
+
+    private String BusinessProcessId;
+
+    @JsonProperty("BusinessProcessId")
+    public String getBusinessProcessId() {
+        return this.BusinessProcessId;
+    }
+
+    @JsonProperty("BusinessProcessId")
+    public void setBusinessProcessId(String BusinessProcessId) {
+        this.BusinessProcessId = BusinessProcessId;
+    }
+
+    private String SobjectType;
+
+    @JsonProperty("SobjectType")
+    public String getSobjectType() {
+        return this.SobjectType;
+    }
+
+    @JsonProperty("SobjectType")
+    public void setSobjectType(String SobjectType) {
+        this.SobjectType = SobjectType;
+    }
+
+    private Boolean IsActive;
+
+    @JsonProperty("IsActive")
+    public Boolean getIsActive() {
+        return this.IsActive;
+    }
+
+    @JsonProperty("IsActive")
+    public void setIsActive(Boolean IsActive) {
+        this.IsActive = IsActive;
+    }
+
+    private User CreatedBy;
+
+    @JsonProperty("CreatedBy")
+    public User getCreatedBy() {
+        return this.CreatedBy;
+    }
+
+    @JsonProperty("CreatedBy")
+    public void setCreatedBy(User CreatedBy) {
+        this.CreatedBy = CreatedBy;
+    }
+
+    private User LastModifiedBy;
+
+    @JsonProperty("LastModifiedBy")
+    public User getLastModifiedBy() {
+        return this.LastModifiedBy;
+    }
+
+    @JsonProperty("LastModifiedBy")
+    public void setLastModifiedBy(User LastModifiedBy) {
+        this.LastModifiedBy = LastModifiedBy;
+    }
+
+    @Override
+    public final SObjectDescription description() {
+        return DESCRIPTION;
+    }
+
+    private static SObjectDescription createSObjectDescription() {
+        final SObjectDescription description = new SObjectDescription();
+
+        final List<SObjectField> fields1 = new ArrayList<>();
+        description.setFields(fields1);
+
+        final SObjectField sObjectField1
+                = createField("Id", "Record Type ID", "id", "tns:ID", 18, false, false, false, false, false, false, true);
+        fields1.add(sObjectField1);
+        final SObjectField sObjectField2
+                = createField("Name", "Name", "string", "xsd:string", 80, false, false, true, false, false, false, true);
+        fields1.add(sObjectField2);
+        final SObjectField sObjectField3 = createField("DeveloperName", "Record Type Name", "string", "xsd:string", 80, false,
+                false, false, false, false, false, false);
+        fields1.add(sObjectField3);
+        final SObjectField sObjectField4 = createField("NamespacePrefix", "Namespace Prefix", "string", "xsd:string", 15, false,
+                true, false, false, false, false, false);
+        fields1.add(sObjectField4);
+        final SObjectField sObjectField5 = createField("Description", "Description", "string", "xsd:string", 255, false, true,
+                false, false, false, false, false);
+        fields1.add(sObjectField5);
+        final SObjectField sObjectField6 = createField("BusinessProcessId", "Business Process ID", "reference", "tns:ID", 18,
+                false, true, false, false, false, false, false);
+        fields1.add(sObjectField6);
+        final SObjectField sObjectField7 = createField("SobjectType", "SObject Type Name", "picklist", "xsd:string", 40, false,
+                false, false, false, false, false, false);
+        fields1.add(sObjectField7);
+        final SObjectField sObjectField8 = createField("IsActive", "Active", "boolean", "xsd:boolean", 0, false, false, false,
+                false, false, false, false);
+        fields1.add(sObjectField8);
+        final SObjectField sObjectField9 = createField("CreatedById", "Created By ID", "reference", "tns:ID", 18, false, false,
+                false, false, false, false, false);
+        fields1.add(sObjectField9);
+        final SObjectField sObjectField10 = createField("CreatedDate", "Created Date", "datetime", "xsd:dateTime", 0, false,
+                false, false, false, false, false, false);
+        fields1.add(sObjectField10);
+        final SObjectField sObjectField11 = createField("LastModifiedById", "Last Modified By ID", "reference", "tns:ID", 18,
+                false, false, false, false, false, false, false);
+        fields1.add(sObjectField11);
+        final SObjectField sObjectField12 = createField("LastModifiedDate", "Last Modified Date", "datetime", "xsd:dateTime", 0,
+                false, false, false, false, false, false, false);
+        fields1.add(sObjectField12);
+        final SObjectField sObjectField13 = createField("SystemModstamp", "System Modstamp", "datetime", "xsd:dateTime", 0,
+                false, false, false, false, false, false, false);
+        fields1.add(sObjectField13);
+
+        description.setLabel("Record Type");
+        description.setLabelPlural("Record Types");
+        description.setName("RecordType");
+
+        final SObjectDescriptionUrls sObjectDescriptionUrls1 = new SObjectDescriptionUrls();
+        sObjectDescriptionUrls1.setDescribe("/services/data/v50.0/sobjects/RecordType/describe");
+        sObjectDescriptionUrls1.setRowTemplate("/services/data/v50.0/sobjects/RecordType/{ID}");
+        sObjectDescriptionUrls1.setSobject("/services/data/v50.0/sobjects/RecordType");
+        description.setUrls(sObjectDescriptionUrls1);
+
+        return description;
+    }
+}
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/StringMSPTest.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/StringMSPTest.java
new file mode 100644
index 00000000000..7e2bf442754
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/StringMSPTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.apache.camel.component.salesforce.api.StringMultiSelectPicklistDeserializer;
+import org.apache.camel.component.salesforce.api.StringMultiSelectPicklistSerializer;
+import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
+
+/**
+ * Sample POJO for MSP tests using Strings instead of Constants.
+ */
+//CHECKSTYLE:OFF
+public class StringMSPTest extends AbstractSObjectBase {
+
+    public StringMSPTest() {
+        getAttributes().setType("MSPTest");
+    }
+
+    private java.lang.String[] MspField;
+
+    @JsonProperty("MspField")
+    @JsonSerialize(using = StringMultiSelectPicklistSerializer.class)
+    public java.lang.String[] getMspField() {
+        return MspField;
+    }
+
+    @JsonProperty("MspField")
+    @JsonDeserialize(using = StringMultiSelectPicklistDeserializer.class)
+    public void setMspField(java.lang.String[] mspField) {
+        this.MspField = mspField;
+    }
+}
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Task.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Task.java
new file mode 100644
index 00000000000..4e7868ac909
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/Task.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import java.time.ZonedDateTime;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
+
+/**
+ * Salesforce DTO for SObject Task
+ */
+//CHECKSTYLE:OFF
+public class Task extends AbstractSObjectBase {
+
+    public Task() {
+        getAttributes().setType("Task");
+    }
+
+    private ZonedDateTime ActivityDate;
+
+    private String Description;
+
+    @JsonProperty("ActivityDate")
+    public ZonedDateTime getActivityDate() {
+        return ActivityDate;
+    }
+
+    @JsonProperty("Description")
+    public String getDescription() {
+        return Description;
+    }
+
+    @JsonProperty("ActivityDate")
+    public void setActivityDate(final ZonedDateTime given) {
+        ActivityDate = given;
+    }
+
+    @JsonProperty("Description")
+    public void setDescription(final String description) {
+        Description = description;
+    }
+
+    private AbstractSObjectBase What;
+
+    @JsonProperty("What")
+    public AbstractSObjectBase getWhat() {
+        return this.What;
+    }
+
+    @JsonProperty("What")
+    public void setWhat(AbstractSObjectBase What) {
+        this.What = What;
+    }
+}
+//CHECKSTYLE:ON
diff --git a/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/User.java b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/User.java
new file mode 100644
index 00000000000..70fe50c26a8
--- /dev/null
+++ b/components-starter/camel-salesforce-starter/src/test/java/org/apache/camel/component/salesforce/springboot/dto/generated/User.java
@@ -0,0 +1,24 @@
+package org.apache.camel.component.salesforce.springboot.dto.generated;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+
+public class User extends AbstractDescribedSObjectBase {
+
+    private String Username;
+
+    @JsonProperty("Username")
+    public String getUsername() {
+        return Username;
+    }
+
+    public void setUsername(String username) {
+        Username = username;
+    }
+
+    @Override
+    public final SObjectDescription description() {
+        return null;
+    }
+}