package com.att.trace.function; import java.util.Optional; import com.att.trace.function.model.User; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.HttpMethod; import com.microsoft.azure.functions.HttpRequestMessage; import com.microsoft.azure.functions.HttpResponseMessage; import com.microsoft.azure.functions.HttpStatus; import com.microsoft.azure.functions.annotation.AuthorizationLevel; import com.microsoft.azure.functions.annotation.BlobInput; import com.microsoft.azure.functions.annotation.FunctionName; import com.microsoft.azure.functions.annotation.HttpTrigger; import com.microsoft.azure.functions.annotation.StorageAccount; import org.springframework.cloud.function.adapter.azure.FunctionInvoker; import reactor.util.function.Tuple2; import reactor.util.function.Tuples; public class HelloHandler extends FunctionInvoker<Tuple2<User, String>, String> { @FunctionName("hello") @StorageAccount("AzureWebJobsStorage") public HttpResponseMessage execute(@HttpTrigger(name = "request", methods = { HttpMethod.GET, HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request, @BlobInput(name = "requestjsonblob", dataType = "string", path = "requestjson/{name}.json") String requestjson, ExecutionContext context) { User user = request.getBody().get(); System.out.println("requestjson=" + requestjson); Tuple2<User, String> input = Tuples.of(user, requestjson); handleRequest(input, context); return request.createResponseBuilder(HttpStatus.OK).body("ok") .header("Content-Type", "application/json").build(); } } package com.att.trace.function; import java.util.function.Function; import com.att.trace.function.model.User; import org.springframework.stereotype.Component; import reactor.util.function.Tuple2; @Component public class Hello implements Function<Tuple2<User, String>, String> { public String apply(Tuple2<User, String> objects) { System.out.println("objects.getT1()=" + objects.getT1()); System.out.println("objects.getT2()=" + objects.getT2()); String output = "test output"; return output; } }
getting below exception when I create tuple of Http trigger and blobinput and send it to handleRequest..
[2021-08-20T09:53:12.816Z] java.lang.UnsupportedOperationException: At the moment only Tuple-based function are supporting multiple arguments [2021-08-20T09:53:12.818Z] at
I need to send both inputs to handleRequest method… any clue how to achieve that?
Advertisement
Answer
Spent some time and the only way I could achieve that what you want is by using DTO class.
package com.example.demo.model; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class HelloInputArguments { private User user; private String content; }
Then handler is easy
package com.example.demo; import com.example.demo.model.HelloInputArguments; import com.example.demo.model.User; import com.microsoft.azure.functions.*; import com.microsoft.azure.functions.annotation.*; import org.springframework.cloud.function.adapter.azure.FunctionInvoker; import java.util.Optional; public class HelloHandler extends FunctionInvoker<HelloInputArguments, String> { @FunctionName("hello") @StorageAccount("DefaultConnection") public HttpResponseMessage execute( @HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request, @BlobInput(name = "file", dataType = "string", path = "requestjson/proam.json") String content, ExecutionContext context) { User user = request.getBody().get(); return request.createResponseBuilder(HttpStatus.OK) .body(handleRequest(new HelloInputArguments(user, content), context)) .header("Content-Type", "application/json") .build(); } }
And function
package com.example.demo; import com.example.demo.model.HelloInputArguments; import org.springframework.stereotype.Component; import java.util.function.Function; @Component public class Hello implements Function<HelloInputArguments, String> { public String apply(HelloInputArguments input) { return input.getContent(); } }
I thin with Tuple are allowed only if you want to pass multiple Fluxs in doc