WebClient of Spring Boot (3rd dependency) conflicts between Azure Function and Azure SDK for Java · Issue #368 · Azure/azure-functions-java-worker (original) (raw)

Describe the bug
When calling webClient in an azure function runtime locally, the log will print an error.

Investigative information

Exception or Stack Trace
[05/11/2020 15:24:58] System.Private.CoreLib: Exception while executing function: Functions.RunMyHttpTrigger. System.Private.CoreLib: Result: Failure [05/11/2020 15:24:58] Exception: NoSuchMethodError: io.netty.handler.ssl.SslProvider.isAlpnSupported(Lio/netty/handler/ssl/SslProvider;)Z [05/11/2020 15:24:58] Stack: java.lang.reflect.InvocationTargetException [05/11/2020 15:24:58] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [05/11/2020 15:24:58] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [05/11/2020 15:24:58] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [05/11/2020 15:24:58] at java.lang.reflect.Method.invoke(Method.java:498) [05/11/2020 15:24:58] at com.microsoft.azure.functions.worker.broker.JavaMethodInvokeInfo.invoke(JavaMethodInvokeInfo.java:22) [05/11/2020 15:24:58] at com.microsoft.azure.functions.worker.broker.JavaMethodExecutor.execute(JavaMethodExecutor.java:54) [05/11/2020 15:24:58] at com.microsoft.azure.functions.worker.broker.JavaFunctionBroker.invokeMethod(JavaFunctionBroker.java:53) [05/11/2020 15:24:58] at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:33) [05/11/2020 15:24:58] at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:10) [05/11/2020 15:24:58] at com.microsoft.azure.functions.worker.handler.MessageHandler.handle(MessageHandler.java:45) [05/11/2020 15:24:58] at com.microsoft.azure.functions.worker.JavaWorkerClient$StreamingMessagePeer.lambda$onNext$0(JavaWorkerClient.java:92) [05/11/2020 15:24:58] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [05/11/2020 15:24:58] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [05/11/2020 15:24:58] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [05/11/2020 15:24:58] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [05/11/2020 15:24:58] at java.lang.Thread.run(Thread.java:748) [05/11/2020 15:24:58] Caused by: java.lang.NoSuchMethodError: io.netty.handler.ssl.SslProvider.isAlpnSupported(Lio/netty/handler/ssl/SslProvider;)Z [05/11/2020 15:24:58] at reactor.netty.http.client.HttpClientSecure.<clinit>(HttpClientSecure.java:79) [05/11/2020 15:24:58] at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.lambda$subscribe$0(HttpClientConnect.java:298) [05/11/2020 15:24:58] at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57) [05/11/2020 15:24:58] at reactor.core.publisher.FluxRetryPredicate$RetryPredicateSubscriber.resubscribe(FluxRetryPredicate.java:124) [05/11/2020 15:24:58] at reactor.core.publisher.MonoRetryPredicate.subscribeOrReturn(MonoRetryPredicate.java:51) [05/11/2020 15:24:58] at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:48) [05/11/2020 15:24:58] at reactor.netty.http.client.HttpClientConnect$MonoHttpConnect.subscribe(HttpClientConnect.java:323) [05/11/2020 15:24:58] at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:55) [05/11/2020 15:24:58] at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) [05/11/2020 15:24:58] at reactor.core.publisher.Mono.subscribe(Mono.java:4210) [05/11/2020 15:24:58] at reactor.core.publisher.Mono.block(Mono.java:1665) [05/11/2020 15:24:58] at de.hybris.azure.trigger.eventtrigger.runMyHttpTrigger.obtainSecuredResource(RunMyHttpTrigger.java:1234) [05/11/2020 15:24:58] at de.hybris.azure.trigger.eventtrigger.runMyHttpTrigger.run(RunMyHttpTrigger.java:1230) [05/11/2020 15:24:58] ... 16 more [05/11/2020 15:24:58] .

Reproduce the issue
Build a function (see code below)
Run mvn clean package azure-functions:run
Call the generated api. The api call will timeout and a stacktrace will be printed.

Code snippet
`public class RunMyHttpTrigger extends AzureSpringBootRequestHandler<HttpRequestMessage, CloseableHttpResponse>
{
@functionName("runMyHttpTrigger")
public HttpResponseMessage run(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage request,
final ExecutionContext context) throws IOException
{
context.getLogger().info("Java HTTP trigger processed a request.");

    obtainSecuredResource(context);
    return  request.createResponseBuilder(HttpStatus.BAD_REQUEST).header("Content-Type","application/json").body("Bad Request.").build();
     
}

public Mono<String> obtainSecuredResource(final ExecutionContext context)
{
    final String tokenURI = "https://abc.def.com/oauth/token";
    final String clientId = "clientId";
    final String clientSecret = "clientSecret";
    final String endPointURI = "https://abc.def.com/registration";

    context.getLogger().info("=========================================\n");
    context.getLogger().info("Access web client...");
    Mono<String> resource = WebClient.builder()
            .build().post().uri(tokenURI).header(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils
                    .encodeToString((clientId + ":" + clientSecret).getBytes())).body(
                    BodyInserters.fromFormData(OAuth2ParameterNames.GRANT_TYPE, GrantType.CLIENT_CREDENTIALS.getValue())).retrieve()
            .onStatus(org.springframework.http.HttpStatus::is4xxClientError, response -> Mono.empty()).bodyToMono(String.class).doOnNext(
                    System.out::println);
   //exception happened this line:
    context.getLogger().info("non-blocking Oauth calls registered..." + resource.block());
    //resource.block();
    //return "test";
    return resource.map(res -> "Retrieved the resource using a manual approach: " + res);
}

}`

In pom.xml, I have explicit the dependency about all io.netty with version 4.1.49.Final, and io.grpc with version 1.29.0.

Setup (please complete the following information):

OS: MacOS
IDE :InteliJ/Terminal