Pascal Schumacher created CAMEL-12116:
-----------------------------------------

             Summary: Camel-http(s)4: Exception when using httpClient query 
parameter
                 Key: CAMEL-12116
                 URL: https://issues.apache.org/jira/browse/CAMEL-12116
             Project: Camel
          Issue Type: Bug
          Components: camel-http4
    Affects Versions: 2.20.1
            Reporter: Pascal Schumacher


According to 
https://github.com/apache/camel/blob/master/components/camel-http4/src/main/docs/http4-component.adoc
 it is possible to provided a custom HttpClient with the query parameter 
_httpClient _.

When I try to use parameter the route can not be created because the httpClient 
does not see to be looked up in the registry:

{noformat}
org.apache.camel.FailedToCreateRouteException: Failed to create route route1 
at: >>> To[https4://localhost:8443?httpClient=allTrustingHttpClient] <<< in 
route: Route(route1)[[From[seda:in]] -> [To[https4://localhost:8443... because 
of Failed to resolve endpoint: 
https4://localhost:8443?httpClient=allTrustingHttpClient due to: Could not find 
a suitable setter for property: httpClient as there isn't a setter method with 
same type: java.lang.String nor type conversion possible: No type converter 
available to convert from type: java.lang.String to the required type: 
org.apache.http.client.HttpClient with value allTrustingHttpClient
        at 
org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1298)
        at 
org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:204)
        at 
org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:1148)
        at 
org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:3727)
        at 
org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3441)
        at 
org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:208)
        at 
org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3249)
        at 
org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3245)
        at 
org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3268)
        at 
org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3245)
        at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
        at 
org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3168)
        at 
org.apache.camel.test.junit4.CamelTestSupport.startCamelContext(CamelTestSupport.java:678)
        at 
org.apache.camel.test.junit4.CamelTestSupport.doSetUp(CamelTestSupport.java:361)
        at 
org.apache.camel.test.junit4.CamelTestSupport.setUp(CamelTestSupport.java:262)
Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve 
endpoint: https4://localhost:8443?httpClient=allTrustingHttpClient due to: 
Could not find a suitable setter for property: httpClient as there isn't a 
setter method with same type: java.lang.String nor type conversion possible: No 
type converter available to convert from type: java.lang.String to the required 
type: org.apache.http.client.HttpClient with value allTrustingHttpClient
        at 
org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:763)
        at 
org.apache.camel.util.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:80)
        at 
org.apache.camel.model.RouteDefinition.resolveEndpoint(RouteDefinition.java:219)
        at 
org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:115)
        at 
org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:121)
        at 
org.apache.camel.model.SendDefinition.resolveEndpoint(SendDefinition.java:62)
        at 
org.apache.camel.model.SendDefinition.createProcessor(SendDefinition.java:56)
        at 
org.apache.camel.model.ProcessorDefinition.makeProcessorImpl(ProcessorDefinition.java:549)
        at 
org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:510)
        at 
org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:226)
        at 
org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1295)
        ... 42 more
Caused by: java.lang.IllegalArgumentException: Could not find a suitable setter 
for property: httpClient as there isn't a setter method with same type: 
java.lang.String nor type conversion possible: No type converter available to 
convert from type: java.lang.String to the required type: 
org.apache.http.client.HttpClient with value allTrustingHttpClient
        at 
org.apache.camel.util.IntrospectionSupport.setProperty(IntrospectionSupport.java:614)
        at 
org.apache.camel.util.IntrospectionSupport.setProperty(IntrospectionSupport.java:645)
        at 
org.apache.camel.util.IntrospectionSupport.setProperties(IntrospectionSupport.java:497)
        at 
org.apache.camel.util.IntrospectionSupport.setProperties(IntrospectionSupport.java:507)
        at 
org.apache.camel.util.EndpointHelper.setProperties(EndpointHelper.java:254)
        at 
org.apache.camel.impl.DefaultComponent.setProperties(DefaultComponent.java:309)
        at 
org.apache.camel.impl.DefaultComponent.setProperties(DefaultComponent.java:297)
        at 
org.apache.camel.component.http4.HttpComponent.createEndpoint(HttpComponent.java:258)
        at 
org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:126)
        at 
org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:716)
        ... 52 more
{noformat}

A test case to replicated this behavior:

{code:java}
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.SSLContext;

import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.junit.Test;


public class Https4CustomHttpClientTest extends CamelTestSupport {

    private static final String IN_URI = "seda:in";
    @Produce(uri = "seda:in")
    private ProducerTemplate in;

    @Test
    public void test() throws Exception {
        CompletableFuture<Object> out = in.asyncRequestBody(IN_URI, "");

        out.get(10, TimeUnit.SECONDS);
    }

    @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                
from(IN_URI).to("https4://localhost:8443?httpClient=allTrustingHttpClient");
            }
        };
    }

    @Override
    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry jndi = super.createRegistry();
        jndi.bind("allTrustingHttpClient", createAllTrustingHttpClient());
        return jndi;
    }

    public static HttpClient createAllTrustingHttpClient() throws Exception {
        SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, 
(certificate, authType) -> true).build();
        return 
HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(new 
NoopHostnameVerifier()).build();
    }
}

{code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to