Error at setup for Resource migration

Ignition 8.3 (no forum tag…)

I migrated a module from 8.1.

At setup I have the following error:

Caused by: java.lang.NullPointerException: Cannot invoke "java.lang.Boolean.booleanValue()" because the return value of "com.bouyguesenergiesservices.ignition.gateway.utils.records.ByesModulesUtilsSettingsResource.NetworkInterfacesTagsEnabled()" is null

The **config.json** file file seems to be ok:

{
"alarmCountEnabled": true,
"alarmMaximumPriority": "Critical",
"alarmMinimumPriority": "Low",
"alarmScanPeriodSec": 10,
"alarmSources": "prov:default:/tag:TVG\*:/alm:\*",
"includeSystem": false,
"networkInterfacesScanPeriodSec": 10,
"networkInterfacesTagsEnabled": true,
"projectListenerEnabled": false,
"projectListenerFilterProjectAdded": false,
"projectListenerFilterProjectDeleted": false,
"projectListenerFilterProjectNames": "global",
"projectListenerFilterProjectUpdated": false,
"projectListenerGatewayMessageHandler": "gwHandlerPlatformUpdate",
"projectListenerGatewayMessageProjectName": "",
"projectListenerMinimalInterval": 60,
"projectListenerNotificationDelay": 30,
"projectListenerUseGatewayScriptingProject": true,
"serverDiagEnabled": true,
"serverDiagScanPeriodSec": 10,
"webServerCacheSeconds": 0,
"webServerDirPath": "C:/web",
"webServerEnabled": true,
"webServerStaticCacheSeconds": 0,
"webServerStaticDirPath": null
}

and the code at setup:

context.getConfigurationManager().getResourceTypeMetaRegistry().register(ByesModulesUtilsSettingsResource.META);
singletonResourceHandler = SingletonResourceHandler.newBuilder(ByesModulesUtilsSettingsResource.META)
        .context(context)
        // add a listener that will be invoked whenever this resource changes
        .onChange(byesModulesUtilsSettingsResource -> {
            // settings globaux => fire onChange même si pas de modif sur la catégory concernée
            managerNetworkInterfaces.onChange(byesModulesUtilsSettingsResource);
            managerServer.onChange(byesModulesUtilsSettingsResource);
            managerWebServer.onChange(byesModulesUtilsSettingsResource);
        })
        .build();

settingsResource = singletonResourceHandler.getResource();
java.lang.Exception: Exception while starting up module "com.bouyguesenergiesservices.utils".
at com.inductiveautomation.ignition.gateway.modules.ModuleInstance.startup(ModuleInstance.java:709)
at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.runStartupPhase(ModuleManagerImpl.java:499)
at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.startup(ModuleManagerImpl.java:459)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.startupInternal(IgnitionGateway.java:1304)
at com.inductiveautomation.ignition.gateway.redundancy.RedundancyManagerImpl.startup(RedundancyManagerImpl.java:352)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.initRedundancy(IgnitionGateway.java:787)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.lambda$initInternal$1(IgnitionGateway.java:712)
at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$ThrowableCatchingRunnable.run(BasicExecutionEngine.java:550)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Cannot invoke "java.lang.Boolean.booleanValue()" because the return value of "com.bouyguesenergiesservices.ignition.gateway.utils.records.ByesModulesUtilsSettingsResource.NetworkInterfacesTagsEnabled()" is null
at com.bouyguesenergiesservices.ignition.gateway.utils.ManagerNetworkInterfaces.onChange(ManagerNetworkInterfaces.java:100)
at com.bouyguesenergiesservices.ignition.gateway.utils.GatewayHook.lambda$setup$0(GatewayHook.java:262)
at com.inductiveautomation.ignition.gateway.config.SingletonResourceHandler$Builder$1.onResourceUpdated(SingletonResourceHandler.java:400)
at com.inductiveautomation.ignition.gateway.config.SingletonResourceHandler.onResourceUpdated(SingletonResourceHandler.java:179)
at com.inductiveautomation.ignition.gateway.config.SingletonResourceHandler$Lifecycle.updateResource(SingletonResourceHandler.java:255)
at com.inductiveautomation.ignition.gateway.config.SingletonResourceHandler$Lifecycle.updateRef(SingletonResourceHandler.java:287)
at com.inductiveautomation.ignition.gateway.config.SingletonResourceHandler$Lifecycle.onStartup(SingletonResourceHandler.java:273)
at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycle.onStartup(ResourceCollectionLifecycle.java:61)
at com.inductiveautomation.ignition.common.lifecycle.AbstractLifecycle.startup(AbstractLifecycle.java:19)
at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory$1.maybeStartLifecycle(ResourceCollectionLifecycleFactory.java:264)
at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory$1.lambda$updateOrStartAffected$4(ResourceCollectionLifecycleFactory.java:248)
at java.base/java.util.Optional.ifPresent(Unknown Source)
at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory$1.lambda$updateOrStartAffected$5(ResourceCollectionLifecycleFactory.java:243)
at java.base/java.util.ArrayList.forEach(Unknown Source)
at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory$1.updateOrStartAffected(ResourceCollectionLifecycleFactory.java:190)
at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory$1.collectionAdded(ResourceCollectionLifecycleFactory.java:145)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source)
at com.inductiveautomation.ignition.gateway.resourcecollection.ResourceCollectionLifecycleFactory.onStartup(ResourceCollectionLifecycleFactory.java:61)
at com.inductiveautomation.ignition.common.lifecycle.AbstractLifecycle.startup(AbstractLifecycle.java:19)
at com.inductiveautomation.ignition.gateway.config.SingletonResourceHandler.onStartup(SingletonResourceHandler.java:145)
at com.inductiveautomation.ignition.common.lifecycle.AbstractLifecycle.startup(AbstractLifecycle.java:19)
at com.bouyguesenergiesservices.ignition.gateway.utils.GatewayHook.startup(GatewayHook.java:362)
at com.inductiveautomation.ignition.gateway.modules.ModuleInstance.startup(ModuleInstance.java:703)
at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.runStartupPhase(ModuleManagerImpl.java:499)
at com.inductiveautomation.ignition.gateway.modules.ModuleManagerImpl.startup(ModuleManagerImpl.java:459)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.startupInternal(IgnitionGateway.java:1304)
at com.inductiveautomation.ignition.gateway.redundancy.RedundancyManagerImpl.startup(RedundancyManagerImpl.java:352)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.initRedundancy(IgnitionGateway.java:787)
at com.inductiveautomation.ignition.gateway.IgnitionGateway.lambda$initInternal$1(IgnitionGateway.java:712)
at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$ThrowableCatchingRunnable.run(BasicExecutionEngine.java:550)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
package com.bouyguesenergiesservices.ignition.gateway.utils.records;

import com.bouyguesenergiesservices.ignition.common.utils.Constantes;
import com.inductiveautomation.ignition.common.alarming.AlarmPriority;
import com.inductiveautomation.ignition.common.resourcecollection.ResourceType;
import com.inductiveautomation.ignition.gateway.config.ResourceTypeMeta;
import com.inductiveautomation.ignition.gateway.dataroutes.openapi.annotations.*;
import com.inductiveautomation.ignition.gateway.web.nav.FormFieldType;


public record ByesModulesUtilsSettingsResource(

        // Category NetworkInterfaces
        //--------------

        @FormCategory("NetworkInterfaces")
        @FormField(FormFieldType.CHECKBOX)
        @Label("TagsEnabled")
        @Required
        //@DefaultValue(Boolean.TRUE)
        @Description("Create Managed tags for Network Interfaces")
        Boolean NetworkInterfacesTagsEnabled,

        @FormCategory("NetworkInterfaces")
        @FormField(FormFieldType.NUMBER)
        @Label("ScanPeriodSec")
        @Required
        @Description("Period for updating Managed tags for Network Interfaces")
        @Maximum("65535")
        @Minimum("0")
        @DefaultValue("10")
        Integer NetworkInterfacesScanPeriodSec,

.....
)
{
    // typeId => nom du dossier
    public static final ResourceType TYPE = new ResourceType(Constantes.MODULE_ID, "settings");

    public static final ByesModulesUtilsSettingsResource DEFAULT = new ByesModulesUtilsSettingsResource(
            true,
            10,
            true,
            10,
            "prov:default:/tag:*:/alm:*",
            AlarmPriority.Low.getIntValue(),
            AlarmPriority.High.getIntValue(),
            false,
            true,
            "global",
            true,
            false,
            true,
            "gwHandlerPlatformUpdate",
            true,
            "",
            30,
            60,
            false,
            "C:/Data",
            30,
            "C:/StaticData",
            0,
            true,
            10
    );

    public static final ResourceTypeMeta<ByesModulesUtilsSettingsResource> META = ResourceTypeMeta.newBuilder(ByesModulesUtilsSettingsResource.class)
            .resourceType(TYPE)
            .singleton()
            .defaultConfig(DEFAULT)
            .categoryName("Byes Modules Utils SettingsResource")            .build();
}


I probably miss something.

your record class field names start with upper case (not the normal convention btw), but your JSON fields don't... might be a problem.

1 Like

Seems like there is one? Topics tagged ignition83

1 Like

Json fields have been generated by the migration strategy, I will try to change the field name in the Record

PersistentRecord was:

public static final BooleanField NetworkInterfacesTagsEnabled = new BooleanField(META, "NetworkInterfacesTagsEnabled", SFieldFlags.SMANDATORY);
public static final IntField NetworkInterfacesScanPeriodSec = new IntField(META, "NetworkInterfacesScanPeriodSec",SFieldFlags.SMANDATORY);

Uppercase in SQLITE

What’s strange, I do not have this issue with 8.3.0-beta4 and a fresh install.

And I still have the issue with 8.3.0 after a gateway reboot

just realize that there was other category :face_with_open_eyes_and_hand_over_mouth: but need to search, the dropdown only display the first one…

I added it for you earlier, those tags in the menu are ordered based on popularity.

I’ve finally renamed the Record and used:

 @Override public List<IdbMigrationStrategy> getRecordMigrationStrategies() {

        logger.info("getRecordMigrationStrategies() : add SingletonRecordMigrationStrategy for ByesModulesUtilsSettingsRecord");

        return List.of(new SingletonRecordMigrationStrategy(
                ByesModulesUtilsSettingsRecord.META,
                ByesModulesUtilsSettingsRecord.Id,
                ByesModulesUtilsSettingsResource.TYPE,
                DefaultRecordEncodingDelegate.newBuilder()
                        .withCustomFieldName(ByesModulesUtilsSettingsRecord.NetworkInterfacesTagsEnabled,"networkInterfacesTagsEnabled")
                        .withCustomFieldName(ByesModulesUtilsSettingsRecord.NetworkInterfacesScanPeriodSec,"networkInterfacesScanPeriodSec")
...

and it solved the issue.

2 Likes