在Java Azure Function

时间:2019-03-19 14:08:55

标签: java azure azure-functions

我试图弄清楚如何使用具有简单温度转换功能的Java创建Azure函数。我尝试定义的路线是:

temps / {method} / {temp?}

我使用以下命令修改了为新的Java项目生成的模板化HttpTrigger代码:

   @FunctionName("temps")
   public HttpResponseMessage run(
        @HttpTrigger(name = "req", 
                    methods = {HttpMethod.GET}, 
                    authLevel = AuthorizationLevel.ANONYMOUS,
                    route = "temps/{method}/{temp:float?}") 
            HttpRequestMessage<Optional<String>> request,
            @BindingName("method") String method,
            @BindingName("temp") String temp,
            final ExecutionContext context) {...}

当我实际将温度值作为最后一个参数传递时,它工作正常,但是如果我仅调用“ temps / {method}”,则在

处会收到 NullPointerException

com.microsoft.azure.functions.worker.binding.BindingDataStore.getTriggerMetatDataByName(BindingDataStore.java:54). 

所以我假设我没有正确定义绑定,因此当URI中不包含最后一个参数时,它可以正确处理。我还看到了许多其他相关信息,其中包括“?”应该工作,所以想知道我是否缺少明显的东西。注意:我有代码可以测试在temp中传递的值是否为float值,所以工作正常。

2 个答案:

答案 0 :(得分:0)

我发现了另一篇文章,其中提供了一个示例,如果不包含可选参数,则提供默认值:

    @FunctionName("temps")
    public HttpResponseMessage run(
        @HttpTrigger(name = "req", 
                    methods = {HttpMethod.GET}, 
                    authLevel = AuthorizationLevel.ANONYMOUS,
                    route = "temps/{method}/{temp=NONE}") 
            HttpRequestMessage<Optional<String>> request,
            @BindingName("method") String method,
            @BindingName("temp") String temp,
            final ExecutionContext context) {...}

这似乎可行,但是并不能解释为什么其他发布的示例带有“?”指定一个可选参数时不要这样做(除非它只是在Java中不起作用,而在C#中起作用)。我还发现,当提供默认值时,您似乎无法同时包含参数类型,例如“ {temp **:float ** = NONE}”。

答案 1 :(得分:0)

我认为Java中的路由参数存在多个问题。 实际上,我在GitHub存储库中为Java中的Azure函数创建了一个关于该问题的问题,我也必须处理该问题,请不要犹豫地添加更多详细信息,以使它得到更多关注:https://github.com/Azure/azure-functions-java-worker/issues/293

编辑:

这是另一种可能的解决方法,它适用于参数类型(实际上,此解决方案仅在指定了参数的情况下有效):用问号写参数,但请勿使用@BindingName注解。而是直接在函数中解析URL。

例如:

@FunctionName("example")
public HttpResponseMessage exampleFunction (
    @HttpTrigger(
        name = "functionTrigger",
        authLevel = AuthorizationLevel.ANONYMOUS,
        methods = {HttpMethod.GET},
        route = "example/{param1:int?}/{param2:int?}" // specify the parameters like this
    ) final HttpRequestMessage<Optional<String>> request,
    final ExecutionContext context
) {
    String[] parameters = request.getUri().getPath().split("/"); // though types were specified, with this way of doing you retrieve the parameters as strings
    int param1 = 0;
    int param2 = 0;
    if (parameters.length > 3) {
        param1 = Integer.parseInt(parameters[3]);
        if (parameters.length > 4) {
            param2 = Integer.parseInt(parameters[4]);
        }
    }
    return request.createResponseBuilder(HttpStatus.OK)
        .body("You sent " + param1 + " and " + param2)
        .build();
}

精度:尽管您以字符串形式检索参数,但是您在路由路径中指定类型的事实阻止了用户发送不同类型的值(如果尝试这样做,该函数将自动以404 Not响应找到)。

此外,这也是使此解决方案偏离理想解决方案的原因,您必须注意URL路径中的“ /”号(例如,不要忘记紧随在“。”之后的“ api”前缀)域(如果您尚未将其删除等)。