Search code examples
coldfusionrailo

How do I append to a struct set in CFPROPERTY?


I'm using <cfproperty /> to make use of implicit getters and setters in ColdFusion (Railo).

However, for more complex values like structs and arrays, how can I append to these?

<cfproperty name="settings" type="struct" />

How can I append an item into the property called settings? If I do the following:

<cfset setSettings(structAppend(getSettings(), { "hello" = "world" })) />

I get the following error:

java.lang.NullPointerException

Am I missing something here? I'm new to the cfproperty tag and thought it would be a time saver, but I can't figure this out.

Also, as a bonus how would I set a default value to these complex data types?

Thanks, Mikey


Solution

  • Couple things here...

    <cfset setSettings(structAppend(getSettings(), { "hello" = "world" })) />
    

    Settings is a struct but structAppend() returns a boolean. Do your struct appending before this line. Second, structs are always passed by reference, meaning, if you do getSettings() you get a struct, which you can make changes to. Another call to getSettings() will return the same struct with the updated settings.

    All you need is this:

    <cfset structAppend(getSettings(), { "hello" = "world" }) />
    

    One last thing. You could be getting a null pointer exception because getSettings() starts uninitialized. In your cfc, in the constructor area (after your properties), you should set an initial settings struct, like this:

    <cfset setSettings({}) />