У меня есть приложение функции azure, которое является EventGridTrigger, и я использую Gradle. Я могу построить свой код и тесты пройдены. Однако при запуске задачи для пакета моих azure функций задача не выполняется, и я получаю это исключение в терминале:
Execution failed for task ':functionsPackage'.
> java.lang.NullPointerException (no error message)
Один из старших инженеров, с которыми я работаю, сказал мне он видел ошибку раньше, и это была ошибка. Он сказал, что обычно это происходит с лямбдами API java 8 streams, и мне нужно будет найти каждую лямбду и заменить ее раздражающим классом, так что я сделал это. Я прокомментировал весь код приложений приложений azure и по частям заново вводил каждую строку кода, пока не обнаружил, какая из них нарушает задачу 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, которое меня смущает, потому что я ожидал, что это будет хотя бы один из методов внутри? Даже если я сделаю метод void или верну true, он все равно сломается. Этот метод вызывается 1 раз внутри моей основной функции EventGridTrigger, которая называется handleEvent (я не писал ни один из этого кода, поэтому я надеялся избежать каких-либо серьезных изменений, чтобы не сломать что-либо). Я вставлю код ниже, но кто-нибудь видел это раньше? Я немного озадачен. Я внес изменения в эту кодовую базу в своей собственной ветке, и ветвь разработки прекрасно компилируется / собирается.
@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);
}
}