gpt4 book ai didi

java - Azure 函数、azureFunctionsPackage 任务因 java.lang.NullPointerException 失败

转载 作者:行者123 更新时间:2023-12-01 17:46:36 24 4
gpt4 key购买 nike

我有一个 azure 函数应用程序,它是一个 EventGridTrigger,并且我正在使用 gradle。我可以构建我的代码并且测试通过。但是,当运行任务来打包我的 azure 函数时,任务失败,并且我在终端中收到此异常:

Execution failed for task ':functionsPackage'.
> java.lang.NullPointerException (no error message)

与我一起工作的一位高级工程师告诉我,他以前看到过这个错误,这是一个错误。他说,这种情况通常发生在 java 8 Streams API lambda 中,我需要找到每个 lambda 并用一个讨厌的类替换,所以我就这样做了。我注释了所有 azure function apps 代码,并逐段重新引入每一行代码,直到找到哪一行破坏了 azureFunctionsPackage 任务,我发现它是这个方法:

private boolean isHandledSubject(SchedulerEventSubject schSubject)
{
// Handle our subscriber ID
//if(SubscriberIds.SWITCH_DMS_ID.equals(schSubject.getSubscriberId()))
//{
// return true;
// }

// If the subscriber ID is ALL and it's a switch or network element
// if(SubscriberIds.ALL_ID.equals(schSubject.getSubscriberId()))
// {
// return ElementType.SWITCH.equals(schSubject.getElementType()) ||
// ElementType.NETWORK.equals(schSubject.getElementType());
// }
//
return false;
}
正如您所看到的,即使我完全注释掉了所有方法主体,它也会破坏代码并导致 NullPointerException,我很困惑,因为我希望它至少是其中的方法之一?即使我使该方法无效或返回 true,它仍然会中断。此方法在名为 handleEvent 的主 EventGridTrigger 函数中被调用 1 次(我没有编写任何代码,因此我希望避免任何重大更改,以避免破坏某些内容)。我将粘贴下面的代码,但是以前有人见过这个吗?我有点困惑。我在自己的分支上对此代码库进行了更改,并且开发分支可以正常编译/构建。

@FunctionName("genericEventHandler")
public void handleEvent(@EventGridTrigger(name = "event") String content) {
try {
if (content == null)
return;

ObjectMapper objMap = new ObjectMapper();
objMap.registerModule(new JodaModule());
EventGridEvent event = SchedulerIcdKt.fromSchedulerEventJson(content);

log.info("EventObject {} ", event);

String schedulerTopic = keyProvider.get(
SCHEDULER_EVENT_GRID_TOPIC_FULL_PATH);

// Check for nulls
if (isBlank(schedulerTopic) || isBlank(event.topic())) {
log.error("Event Grid Topic was NULL! KeyVault:{} Event Topic:{}", schedulerTopic, event.topic());
return;
}

// First check if we even have an event from the Scheduler
if (!event.topic().equalsIgnoreCase(schedulerTopic))
return;

SchedulerEventSubject schSubject = new SchedulerEventSubject(event.subject());

@SuppressWarnings("unchecked")
List<SchedulerEvent> schedulerEventList = (List<SchedulerEvent>) event.data(); //unsafe cast

if (!isHandledSubject(schSubject))
return;

schedulerEventList.stream().forEach(new Consumer<SchedulerEvent>() {
@Override
public void accept(SchedulerEvent schedEvent) {
String networkId;
SnmpCred cred = new SnmpCred();

if (schedEvent.getActionType().equals(SchedulerEventActionType.NetworkCreate)) {
NetworkCreate network_create = (NetworkCreate) schedEvent;
networkId = network_create.getNetworkId();
} else if (schedEvent.getActionType().equals(SchedulerEventActionType.NetworkUpdate)) {
NetworkUpdate network_update = (NetworkUpdate) schedEvent;
networkId = network_update.getNetworkId();
} else {
log.info("Unhandled scheduler data: {}", schedEvent);
return;
}

try {
Optional<Network> network = DataGatewayFactory.getInstance().getNetworkCrud().get(networkId);

if (!network.isPresent()) {
log.error("Error trying to retreive Network with ID {} from the database.", networkId);
return;
}

boolean status;

// If Deployment Type is DEMO, ONLY call deployPtpConfigBlob (no switch config)
if (network.get().getDeploymentType().equals(DeploymentType.DEMO)) {
status = deployPtpConfigBlob(network.get());
} else {
createOrGetNetworkSnmpPassword(network.get(), cred);

if ((status = deploySwitchConfigBlob(network.get(), cred.getAuth(), cred.getPriv()))) {
status = deployPtpConfigBlob(network.get());
}
}

// Return the same scheduler subject with the subject Id set to switch dms
schSubject.setSubscriberId(SubscriberIds.SWITCH_DMS_ID);
EventGridFunctions.this.publishDmsStatus(schSubject, status, schedEvent);
} catch (Exception de) {
log.error("Exception while trying to retreive the network {}.", networkId, de);
}
}
});
} catch (Exception e) {
log.error("EventObject {} ", content, e);
}
}

最佳答案

好的,我可以通过注释 Azure 函数中的所有代码来“修复”此问题,而项目中的其他代码则未注释且能够运行。我构建了该项目并且成功了。这让我知道问题 100% 出在我的 Azure 函数上。

然后,我注释掉了 azure 函数中的所有代码,并逐行取消注释并重新构建,以查看它何时会中断。

当我点击一个方法时,比如我上面发布的“isHandledSubject”方法,构建将因 NullPointerException 而中断。即使使用空方法体和 void 作为返回类型。我在运行 azureFunctionsPackage 类时打印出 --scan 信息时看到 ClassPath = null,因此我决定将该方法移到该类之外(即,我创建了一个名为“HelperFunctions.java”的新类并将方法放在其中)。

您瞧,构建成功了。然后,我将所有其他方法放置在与 Azure 函数相同的 .java 文件中(EventGridTriggers、QueueTriggers、HttpTriggers 等),并将它们移到相关类之外,并将它们放入 HelperFunctions.java 中,一切都构建得很好。

我仍然不太明白这个错误的根源,但构建也在云(azure devops)上成功,所以我很高兴:D

关于java - Azure 函数、azureFunctionsPackage 任务因 java.lang.NullPointerException 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60857725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com