0

我使用 SpringCloud 对 Azure Functions 测试服务的 junit 测试得到了一个相当无用的 NullPointerException。我在这方面完全是新手,所以如果这看起来很明显,我深表歉意。

堆栈跟踪:

java.lang.NullPointerException   
at org.springframework.cloud.function.adapter.azure.AzureSpringBootRequestHandler.doResolveName(AzureSpringBootRequestHandler.java:86) 
at org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer.initFunctionConsumerOrSupplierFromCatalog(AbstractSpringFunctionAdapterInitializer.java:387) 
at org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer.initialize(AbstractSpringFunctionAdapterInitializer.java:124) 
at org.springframework.cloud.function.adapter.azure.AzureSpringBootRequestHandler.handleRequest(AzureSpringBootRequestHandler.java:58) 
at test.TestCloud.start(TestCloud.java:42)

我认为 NPE 可能是由于我将 null 传递给 handleRequest 的第二个参数引起的,但这就是我查看的示例正在做的事情。我已经使用我制作的具体扩展或通用版本尝试了注释行或它下面的行。两者的行为相同,并且控制永远不会到达执行方法。该示例使用泛型类,但具体实现对我来说似乎更有意义(否则我看不到连接是如何建立的)。

    @Test
    public void start() throws Exception {
//        AzureSpringBootRequestHandler<String, String> handler = new AzureSpringBootRequestHandler<String, String>(CloudFunctionApplication.class);
        AzureReverseAdapter handler = new AzureReverseAdapter(CloudFunctionApplication.class);
        String result = handler.handleRequest("Hello World", null);
        handler.close();
        Assert.assertEquals(result, "dlroW olleH");
    }

测试类现在只有一个函数,它在下面。

@FunctionName("reverseString")
public String execute(@HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, ExecutionContext context) {

    context.getLogger().info("Input: " + request.getBody().get());
    return handleRequest(request.getBody().get(), context);
}

CloudFunctionApplication 类具有如下所示的方法。奇怪的是,我不知道怎么做,但控制确实达到了这个功能。我认为执行方法应该充当重定向,但无论如何它似乎找到了reserveString。我猜是因为它是唯一的@FunctionName?

这就是方法。return(value) -> { 行上的断点被断点击中,但异常发生在调用内部之前。

@Bean
public Function<String, String> reverseString() {
    return (value) -> {
        return new StringBuilder(value).reverse().toString();
    };
}

更新:链接的问题绝对不是这个问题的重复。是的,所有 NullPointerExceptions 都是因为当您尝试取消引用它时某些内容为空。该链接是对此的通用处理。这是一个关于我为什么从 3rd 方库中获得它的具体问题。所以它们绝对不一样。

但是,我发现了评论中建议的问题。那是我将 null 作为第二个参数传入。这似乎是允许的,因为我正在研究的示例也是如此。我的解决方案是模拟制造一个返回基本值的 ExecutionContext 对象。不幸的是,我无法将其记录为答案,因为有人认为我只是在问 NullPointerException 是什么并将该问题标记为欺骗。

所以对于遇到同样问题的其他人来说,这就是我的答案。

4

2 回答 2

0

发生这种java.lang.NullPointerException情况是因为该对象未实例化但已被使用。

实例化就是将实例的地址分配给对象,NullPointerException往往是因为获取到的对象的实例不存在,所以返回的地址为null。直接引用这个不存在的实例地址而不判断错误情况会引发这个异常。

您的问题的输出异常告诉您实例没有成功创建。您创建 AzureSpringBootRequestHandler 的实例失败,因此您得到了 NullPointerException。配置可能有问题。

这应该不是你传入的null值造成的。官方文件也是传入了null。抛出的异常表明您甚至没有成功创建实例。您尝试扩展 AzureSpringBootRequestHandler 并出现 NullPointException ,问题应该是您的 AzureSpringBootRequestHandler 版本没有 Azure 功能所需的重要内容。

这两个文档可能会给您一些帮助:

Azure 中的 Spring Cloud 函数

AzureSpringBootRequestHandler.java的版本(点击左上角的'branch'并选择版本)

于 2019-09-24T10:56:19.670 回答
0

在示例中,您基于 HelloFunctionTest 类的第一个语句在 <> 括号之间没有类型声明:

AzureSpringBootRequestHandler<User, Greeting> handler = new AzureSpringBootRequestHandler<>(HelloFunction.class);

但是,您的等价物(据我所知,AzureSpringBootRequestHandler)确实有,并且有(见下文)。我会亲自从这里开始,但如果没有链接,则很难确定要环顾四周的代码。

AzureSpringBootRequestHandler<String, String> handler = new AzureSpringBootRequestHandler<String, String>(CloudFunctionApplication.class);

在理解示例之前,您已经自行切线,因此很难针对给定的基本示例提出问题。我建议您按照示例进行操作,以便您真正理解它,然后继续您自己的实现,否则您最终会陷入纠结和非常困惑!

于 2019-09-23T20:32:27.553 回答